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 > <dami...@esi.com.au>: > > 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