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.
I tried to look in malloc.c and realized that now there are 6 versions in
/usr/src. After reading them all, my head started spinning.
Is there was an easy answer?
Regards - Damian
Source of aligntonext ------>
#include <sys/param.h>
#include <sys/types.h>
#include <assert.h>
/*
* http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetTable
*/
static unsigned int
numberofsetbits(unsigned int i)
{
i = i - ((i >> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}
/*
* adjust pointer such that is aligned to a given number of bytes
*/
void *
aligntonext(void *x, size_t size)
{
unsigned int bits = numberofsetbits((unsigned int) (size - 1));
unsigned long long p = (unsigned long long) x;
assert(size == (size_t)(1 << bits));
p += (1 << bits) - 1;
p >>= bits;
p <<= bits;
return (void *) p;
}
Regards - Damian
Pacific Engineering Systems International, 277-279 Broadway, Glebe NSW 2037
Ph:+61-2-8571-0847 .. Fx:+61-2-9692-9623 | unsolicited email not wanted here
Views & opinions here are mine and not those of any past or present employer