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