结构填充和字节大小字段的对齐?

时间:2014-05-25 20:13:05

标签: c padding memory-alignment

如果我有一个如下所示的结构,在32位机器上,结构中是否会有填充?据我了解,该结构将所有内容与其最大的字段对齐,那么如果最大字段是一个字节(uint8)会怎么样?

struct s {
    uint8_t a[32];
    uint8_t b[64];
};

感谢。

1 个答案:

答案 0 :(得分:1)

成员之间可能存在填充。

C标准6.7.2.1(15):在结构对象中,非位字段成员和位域所在的单元具有按声明顺序增加的地址。指向适当转换的结构对象的指针指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然。 结构对象中可能有未命名的填充,但不在其开头。

(14)结构或联合对象的每个非位字段成员在实现中对齐 - 定义的方式适合其类型。

现代机器上的成员之间可能没有填充,但C不能保证,所以不要依赖它。

您可以使用ofsetoff()宏确定是否存在填充,然后使用静态断言进行管理。