结构体的 sizeof 和 _Alignof 值
The sizeof and _Alignof value of a structure
下列哪些选项在标准 C 中是正确的?
(A) sizeof
一个结构等于:
其最后一个成员的相对地址加上 sizeof
其最后一个成员。 (我知道这不可能是真的。)
其最后一个成员的相对地址加上其最后一个成员的对齐值(由_Alignof
运算符获得)。 (这 不能 也为真,因为在某些情况下 sizeof
类型可能大于其 _Alignof
值。参见 32 中的 long double
位 Windows GCC:sizeof
是 12,_Alignof
是 4。)
其最后一个成员的相对地址加上结构本身的对齐值。 (这也不可能是真的,正如前面声明中所解释的那样。)
其最后一个成员的相对地址加上最后一个成员大小的最大值和结构本身.
的对齐值
其他。
通过相对地址我的意思是它的最后一个成员的起始字节和它的第一个成员(或结构本身)的起始字节之间的距离,可以用offsetof
像这样的宏:offsetof(struct st, last_member)
.
(B)结构的_Alignof
值等于:
其 成员的 _Alignof
值最大 _Alignof
值。
其他。
备注:
我不是在谈论特定环境下的特定实现,而是“标准 C (C18)” 兼容实现在理论上应该如何表现。
_Alignof
是标准的 C 运算符,alignof
是其在 stdalign.h
header.
中定义的宏同义词
A 的答案是“别的东西”。
结构的大小必须至少是其最后一个成员的偏移量加上该成员的大小加上足够的填充字节以使结构的大小是其对齐要求的倍数(等于任何结构的最大对齐要求)其成员)。 C 实现可能会以对齐要求的倍数添加额外的填充字节,尽管我知道 none 会这样做。
B 的答案是结构的对齐要求(其 _Alignof
值)等于其成员的最严格对齐要求(它们的最大 _Alignof
值)。
请特别注意 C 2018 6.2.7 4 说“......每个有效对齐值都应是 2 的非负整数幂。”因此,如果任何对齐满足最严格的成员对齐要求,则它满足每个成员对齐要求,因此就足够了。
下列哪些选项在标准 C 中是正确的?
(A) sizeof
一个结构等于:
其最后一个成员的相对地址加上
sizeof
其最后一个成员。 (我知道这不可能是真的。)其最后一个成员的相对地址加上其最后一个成员的对齐值(由
_Alignof
运算符获得)。 (这 不能 也为真,因为在某些情况下sizeof
类型可能大于其_Alignof
值。参见 32 中的long double
位 Windows GCC:sizeof
是 12,_Alignof
是 4。)其最后一个成员的相对地址加上结构本身的对齐值。 (这也不可能是真的,正如前面声明中所解释的那样。)
其最后一个成员的相对地址加上最后一个成员大小的最大值和结构本身.
的对齐值其他。
通过相对地址我的意思是它的最后一个成员的起始字节和它的第一个成员(或结构本身)的起始字节之间的距离,可以用offsetof
像这样的宏:offsetof(struct st, last_member)
.
(B)结构的_Alignof
值等于:
其 成员的
_Alignof
值最大_Alignof
值。其他。
备注:
我不是在谈论特定环境下的特定实现,而是“标准 C (C18)” 兼容实现在理论上应该如何表现。
中定义的宏同义词_Alignof
是标准的 C 运算符,alignof
是其在stdalign.h
header.
A 的答案是“别的东西”。
结构的大小必须至少是其最后一个成员的偏移量加上该成员的大小加上足够的填充字节以使结构的大小是其对齐要求的倍数(等于任何结构的最大对齐要求)其成员)。 C 实现可能会以对齐要求的倍数添加额外的填充字节,尽管我知道 none 会这样做。
B 的答案是结构的对齐要求(其 _Alignof
值)等于其成员的最严格对齐要求(它们的最大 _Alignof
值)。
请特别注意 C 2018 6.2.7 4 说“......每个有效对齐值都应是 2 的非负整数幂。”因此,如果任何对齐满足最严格的成员对齐要求,则它满足每个成员对齐要求,因此就足够了。