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

Reply via email to