如果我有一个如下所示的结构,在32位机器上,结构中是否会有填充?据我了解,该结构将所有内容与其最大的字段对齐,那么如果最大字段是一个字节(uint8)会怎么样?
struct s {
uint8_t a[32];
uint8_t b[64];
};
感谢。
答案 0 :(得分:1)
成员之间可能存在填充。
C标准6.7.2.1(15):在结构对象中,非位字段成员和位域所在的单元具有按声明顺序增加的地址。指向适当转换的结构对象的指针指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然。 结构对象中可能有未命名的填充,但不在其开头。
(14)结构或联合对象的每个非位字段成员在实现中对齐 - 定义的方式适合其类型。
现代机器上的成员之间可能没有填充,但C不能保证,所以不要依赖它。
您可以使用ofsetoff()宏确定是否存在填充,然后使用静态断言进行管理。