对齐结构体/类对象填充字节存储值及Data结构体实例疑问
结构体对齐填充字节的值解析
问题1:对齐的结构体/类对象的填充字节中存储的值是什么?
直白点说:C++标准对此没有强制规定,填充字节的值是未指定的。
填充字节是编译器为了满足内存对齐要求,在结构体成员之间或末尾插入的额外字节。这些字节不属于结构体的任何成员,所以标准没要求它们必须有确定的值——可能是内存里的残留垃圾数据,也可能是零,完全取决于:
- 编译器的实现策略
- 结构体的分配位置(栈、堆、全局/静态存储区)
- 是否进行了显式初始化
务必记住:永远不要依赖填充字节的内容,这属于未定义行为,换个编译器、编译选项甚至运行环境,结果都可能天差地别。
问题2:针对struct Data { std::uint32_t b; char a; };(4字节对齐,sizeof(Data) == 8),第5至第7字节的值是什么?是否默认为零?
这个得拆分场景来看:
栈上的局部未初始化变量:
void func() { Data d; // 未初始化 }此时
d的填充字节(第5-7字节)是栈内存的残留垃圾值,绝对不是默认零。全局/静态变量:
Data global_d; // 全局变量 static Data static_d; // 静态变量全局和静态变量会被放在程序的
.bss段,操作系统在程序启动时会把这个区域的所有字节置零,所以填充字节也会是零。堆上分配的内存:
- 用
malloc分配:Data* d = (Data*)malloc(sizeof(Data));,堆内存未初始化,填充字节是垃圾值。 - 用
new默认分配:Data* d = new Data;,对于这个POD类型的Data,和malloc效果一致,未初始化,填充字节是垃圾值。 - 用
new值初始化:Data* d = new Data();,这时整个结构体(包括填充字节)都会被置零,第5-7字节自然是零。
- 用
总结:只有在全局/静态变量或者显式值初始化的情况下,填充字节才会是零;其他未初始化的场景,填充字节的值都是不确定的垃圾值。
内容的提问来源于stack exchange,提问作者realxie
相关产品推荐
相关产品推荐

