首页 > 解决方案 > 结构体的 sizeof 和 _Alignof 值

问题描述

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

(A) asizeof结构等于:

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

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

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

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

  5. 别的东西。

相对地址是指其最后一个成员的起始字节与其第一个成员(或结构本身)的起始字节之间的距离,可以使用如下offsetof宏获得:offsetof(struct st, last_member).


(B)结构的_Alignof值等于:

  1. _Alignof最大成员的_Alignof

  2. 别的东西。


笔记:

标签: csizeofalignof

解决方案


A 的答案是“别的东西”。</p>

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

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

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


推荐阅读