有关C结构包装的保证吗?

时间:2017-12-05 21:17:28

标签: c packing

是否有任何关于在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? 。无需担心我想要访问单个字节。

1 个答案:

答案 0 :(得分:3)

C标准关于结构打包的唯一内容是在struct开始时不存在填充。它不保证字段之间或最后的填充。

C standard的第6.7.2.1节说明了以下有关结构:

  

15 在结构对象中,非位字段成员和位字段所在的单位具有增加的地址   声明它们的顺序。指向结构对象的指针,   适当转换,指向其初始成员(或如果该成员是   比特字段,然后到它所在的单元,反之亦然。   结构对象中可能有未命名的填充,但不在其中   开始。

     

...

     

17 结构或联合的末尾可能有未命名的填充。

话虽如此,大多数实现都倾向于与结构的打包方式相当一致。非结构变量n字节大小(或数组这样的变量)将倾向于从n字节边界开始。结构中的结构将倾向于根据其子字段的对齐方式进行对齐。

The Lost Art of C Structure Packing更详细地介绍了这一点。