C++ 对象布局之padding(填充字节)
padding(填充字节)就是为了让成员按“对齐要求”放置,而在两个成员之间自动塞进去的“空白字节”,程序不会用到这些字节的实际内容。
简单说几点:
每种类型有自己的对齐要求
比如常见情况(具体跟平台/编译器有关):char对齐 1 字节int对齐 4 字节double对齐 8 字节
意思是:这个成员的起始地址通常要是对应数字的倍数,比如
double要从 8 的倍数的地址开始放。编译器为满足对齐,在中间塞“空位”
你的例子:struct A {int x; // 4 字节,对齐 4char c; // 1 字节,对齐 1double d;// 8 字节,对齐 8 };在内存里大致是:
先放
int x:占 4 字节再放
char c:占 1 字节接下来要放
double d,它要求地址是 8 的倍数此时偏移是 5(从 0 开始:0~3 是 x,4 是 c),5 不是 8 的倍数
编译器就塞入 3 个字节的 padding,让下一个成员从偏移 8 开始
然后从偏移 8 放
double d(8 字节)
所以布局类似:
[int x(4B)] [char c(1B)] [padding(3B)] [double d(8B)]存在的目的
满足 CPU 对内存对齐的要求
提高访问效率(对齐访问通常比不对齐快,有的架构甚至不允许不对齐访问)
一句话总结:
padding是编译器自动插入的“占位用垃圾字节”,不存储你的有效数据,只是为了让后面的成员在“合适的地址”上开始,从而满足对齐和性能需求。
