是否有任何关于在C中包装结构的保证?
仅作为示例,只要sizeof(double) == 8
,是否保证sizeof(struct { double x, y; }) == 16
?
我知道这个问题背后的意图与严格的别名规则冲突,因此假设禁用了严格的别名,例如:对于带有-fno-strict-aliasing
的gcc。
避免任何进一步的推测:目的是了解结构与其明确打包的对应物的兼容性。请注意,即使在以下情况下,别名也是相关的:Are C-structs with the same members types guaranteed to have the same layout in memory? 。无需担心我想要访问单个字节。
答案 0 :(得分:3)
C标准关于结构打包的唯一内容是在struct
开始时不存在填充。它不保证字段之间或最后的填充。
C standard的第6.7.2.1节说明了以下有关结构:
15 在结构对象中,非位字段成员和位字段所在的单位具有增加的地址 声明它们的顺序。指向结构对象的指针, 适当转换,指向其初始成员(或如果该成员是 比特字段,然后到它所在的单元,反之亦然。 结构对象中可能有未命名的填充,但不在其中 开始。强>
...
17 结构或联合的末尾可能有未命名的填充。
话虽如此,大多数实现都倾向于与结构的打包方式相当一致。非结构变量n
字节大小(或数组这样的变量)将倾向于从n
字节边界开始。结构中的结构将倾向于根据其子字段的对齐方式进行对齐。
The Lost Art of C Structure Packing更详细地介绍了这一点。