Hello,
On Tue, 8 Aug 2023, Martin Uecker via Gcc-patches wrote:
> There at least three different size expression which could
> make sense. Consider
>
> short foo { int a; short b; char t[]; };
>
> Most people seem to use
>
> sizeof(struct foo) + N * sizeof(foo->t);
>
> which for N == 3 yields 11 bytes on x86-64 because the formula
> adds the padding of the original struct. There is an example
> in the C standard that uses this formula.
>
>
> But he minimum size of an object which stores N elements is
>
> max(sizeof (struct s), offsetof(struct s, t[n]))
>
> which is 9 bytes.
But should it really? struct sizes should usually be a multiple of a
structs alignment, and if int is 4-aligned only size 12 would be correct.
I don't see why one should deviate from that general rule for sizes for
FAM structs. (I realize that the above is not about sizeof(), but rather
bdos/bos, but I think it's fairly useful that both agree when possbible).
Say, if you were to allocate an array of such struct foos, each having 3
elements in foo.t[]. You need to add 12 bytes to go to the next array
element, not 9. (Of course arrays of FAM-structs are somewhat meh, but
still). It's true that you would be allowed to rely on only 9 bytes of
those 12 bytes (the rest being padding), so perhaps it's really the right
answer for __bos, but, hmm, 12 seems to be "more correct" to my guts :-)
Ciao,
Michael.