c - 结构体的 sizeof 和 _Alignof 值
问题描述
下列哪项在标准 C 中是正确的?
(A) asizeof
结构等于:
其最后一个成员的相对地址加上
sizeof
其最后一个成员。(我知道这不可能是真的。)其最后一个成员的相对地址加上其最后一个成员的对齐值(由运算
_Alignof
符获得)。(这也不正确,因为在某些情况下a 类型可能大于其值。请参阅32 位 Windows GCC:是 12,是 4。)sizeof
_Alignof
long double
sizeof
_Alignof
其最后一个成员的相对地址加上结构本身的对齐值。(这也不可能是真的,正如前面的陈述中所解释的那样。)
其最后一个成员的相对地址加上最后一个成员的最大大小和结构本身的对齐值。
别的东西。
相对地址是指其最后一个成员的起始字节与其第一个成员(或结构本身)的起始字节之间的距离,可以使用如下offsetof
宏获得:offsetof(struct st, last_member)
.
(B)结构的_Alignof
值等于:
_Alignof
其最大成员的 值_Alignof
。别的东西。
笔记:
我不是在谈论特定环境中的特定实现,而是在理论上,符合“标准 C (C18)”的实现应该如何表现。
_Alignof
是标准的 C 运算符,是在header 中alignof
定义的宏同义词。stdalign.h
解决方案
A 的答案是“别的东西”。</p>
结构的大小必须至少为其最后一个成员的偏移量加上该成员的大小加上足够的填充字节,以使结构的大小成为其对齐要求的倍数(等于其任何成员的最大对齐要求)。AC 实现可能会在对齐要求的倍数中添加额外的填充字节,尽管我不知道这样做。
B 的答案是结构的对齐要求(其_Alignof
值)等于其成员的最严格对齐要求(_Alignof
它们的最大值)。
特别要注意的是,C 2018 6.2.7 4 说“……每个有效的对齐值都应该是 2 的非负整数幂。” 因此,如果任何对齐满足最严格的成员对齐要求,则它满足每个成员对齐要求,因此就足够了。
推荐阅读
- c# - 使用 C# 检查字符串是否包含给定数字范围内的整数
- ruby-on-rails - 是否可以使用 Wisper 将一个订阅应用于多个侦听器?
- r - 识别具有变量所有缺失值的组并在 R 中的组内推断
- excel - 如果偏移量相同,则根据以下值填充空单元格
- java - java -version 不想加载我的 Java_home 的新值
- reactjs - 满足条件后如何取消地图?
- python - 创建小型聊天机器人时出现 rasa_nlu 错误
- python - 是否可以从一个文件到另一个文件使用 Django 模板块?
- react-native - 我怎样才能在需要反应原生时制作一个选择器
- angular - 如何在订阅 Angular 中更好地编写订阅?