On Tue, Aug 26, 2014 at 12:57:21PM +0100, Ramsay Jones wrote:

> > +   ret = xcalloc(1, base + extra);
> > +   va_start(ap, fmt);
> > +   vsnprintf(ret + offset, extra, fmt, ap);
> 
> What is the relationship between 'base' and 'offset'?
> 
> Let me assume that base is always, depending on your compiler, either
> equal to offset or offset+1. Yes? (I'm assuming base is always the
> sizeof(struct whatever)). Do you need both base and offset?

It's much more complicated than that. Take "struct name_decoration", for
instance, which looks like this:

  struct name_decoration {
        struct name_decoration *next;
        int type;
        char name[FLEX_ARRAY];
  };

On my 64-bit system using gcc, sizeof() returns 16; it has to pad the
whole thing to 64-bit alignment in case I put two of them in an array.
But offsetof(name) is 12, since the array of char does not need the same
alignment; it can go right after the type and make use of the padding
bits.

As a side note, that means that the original "char name[1]" (before it
became FLEX_ARRAY) was not any less efficient on 64-bit machines (the
1-byte went into the padding, and sizeof() was the same). It did matter
on 32-bit systems, though where it bumped the empty struct size from 12
to 16.

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to