编译器是否始终将结构体置于对齐内存地址?结合实例咨询
结构体
my_char_t的内存地址是否始终对齐? 答案是肯定的,my_char_t类型的变量内存地址必然是对齐的,原因如下:
- 基本类型的对齐规则:
char类型的对齐要求是1字节——也就是说,任何内存地址都能满足char的对齐需求,不需要额外的地址约束。 - 结构体的对齐规则:结构体的整体对齐要求等于其所有成员中对齐要求最高的那个值。对于
my_char_t来说,唯一的成员是char,所以结构体的对齐要求就是1字节。这意味着无论内存分配器把它放在哪个地址,都符合对齐要求。
你之前看到的my_char2_t结构体里的填充(padding),和char成员的对齐无关:
my_char2_t里的int成员通常有更高的对齐要求(比如4字节),为了让int成员的地址满足自身的对齐规则,编译器才会在char后面添加填充字节。- 这里的
char成员本身只需要1字节对齐,它的地址可以是任何值,填充的目的是为了满足int的对齐需求,而非char的。
内容的提问来源于stack exchange,提问作者arye
相关产品推荐
相关产品推荐

