首页 > 解决方案 > 什么值存储在对齐的结构/类对象的填充字节中

问题描述


struct Data
{
    std::uint32_t b;
    char a;
};

Data 类型按 4 个字节对齐,因此 sizeof(Data) == 8。

但是第 5-7 个字节中的值是多少?它是默认零吗?

标签: c++cmemory-alignmentmemory-layout

解决方案


它实际上取决于一些东西,所有这些都在 C++ 标准中有详细说明[dcl.init]

根据存储持续时间、各种类型的构造函数的存在等,最终的各个部分要么是默认初始化,要么是零初始化或值初始化。

默认初始化意味着整个变量将是某个任意值,而零初始化零初始化所有成员并将填充字节设置为零。

所以Data d1;static Data d2;不一定有相同的填充字节。

值初始化有点复杂,因为它在调用构造函数(如果存在)之前有效地首先选择默认或零初始化。


但最重要的是,这可能无关紧要。如果填充的内容很重要,您应该将该空间“注册”为真正的成员变量,以便您可以使用它们(并正确初始化它们)。填充在变量的“值”中非常不重要,除非你做了一些疯狂的memcmp事情,或者在它占据的整个内存块上运行校验和:-)


推荐阅读