结构体的 sizeof 和 _Alignof 值

The sizeof and _Alignof value of a structure

下列哪些选项在标准 C 中是正确的?

(A) sizeof一个结构等于:

  1. 其最后一个成员的相对地址加上 sizeof其最后一个成员。 (我知道这不可能是真的。)

  2. 其最后一个成员的相对地址加上其最后一个成员的对齐值(由_Alignof运算符获得)。 (这 不能 也为真,因为在某些情况下 sizeof 类型可能大于其 _Alignof 值。参见 32 中的 long double位 Windows GCC:sizeof 是 12,_Alignof 是 4。)

  3. 其最后一个成员的相对地址加上结构本身的对齐值。 (这也不可能是真的,正如前面声明中所解释的那样。)

  4. 其最后一个成员的相对地址加上最后一个成员大小的最大值和结构本身.

    的对齐值
  5. 其他。

通过相对地址我的意思是它的最后一个成员的起始字节和它的第一个成员(或结构本身)的起始字节之间的距离,可以用offsetof 像这样的宏:offsetof(struct st, last_member).


(B)结构的_Alignof值等于:

  1. 成员的 _Alignof 值最大 _Alignof 值。

  2. 其他。


备注:

A​​ 的答案是“别的东西”。

结构的大小必须至少是其最后一个成员的偏移量加上该成员的大小加上足够的填充字节以使结构的大小是其对齐要求的倍数(等于任何结构的最大对齐要求)其成员)。 C 实现可能会以对齐要求的倍数添加额外的填充字节,尽管我知道 none 会这样做。

B 的答案是结构的对齐要求(其 _Alignof 值)等于其成员的最严格对齐要求(它们的最大 _Alignof 值)。

请特别注意 C 2018 6.2.7 4 说“......每个有效对齐值都应是 2 的非负整数幂。”因此,如果任何对齐满足最严格的成员对齐要求,则它满足每个成员对齐要求,因此就足够了。