On Fri, Feb 03, 2017 at 04:07:25PM +0100, Boudewijn Dijkstra wrote:
> Op Sat, 28 Jan 2017 06:26:16 +0100 schreef Damian McGuckin
> <[email protected]>:
> > What is the recommended most portable way to force memory alignment for
> > a datum of any type, assuming one has a pointer say
> >
> > char *x
> >
> > I currently use something like
> >
> > char *xany = aligntonext(x, sizeof(long))
> >
> > where I use my own function 'aligntionext' which is defined below and I
> > also assume that a 'long' will be the natural word-size of the machine
> > and that any datum things just needs to align to this boundary. That
> > said, if the second argument is say 4k, the function will align its
> > result to a 4k boundary.
> >
> > I was wondering if there is an optimal, better, more acceptable, or more
> > portable, way.
> >
>
> Easy and very portable:
>
> void *
> aligntonext(void *x, size_t size)
> {
> return (void *)((((uintptr_t)x + size - 1u) / size) * size);
> }
>
> Whether it is optimal depends on compiler optimization.
Isn't this stuff macros are made of:
# define aligntonext(ptr, size) \
((void*)((((uintptr_t)(ptr) + (size) - 1u) / (size)) * (size)))
Or
# define aligntonext(ptr, bits) \
((void*)((((uintptr_t)(ptr) + (1<<(bits)) - 1u) >> (bits)) << (bits)))
Note that the second argument is evaluated three times in both variants...
--
/ Raimo Niskanen, Erlang/OTP, Ericsson AB