struct Data
{
std::uint32_t b;
char a;
};数据类型由4个字节对齐,因此(数据)的大小为== 8。
但是,以5-7字节为单位的值是多少呢?它是默认的零吗?
发布于 2019-12-30 09:17:11
它实际上取决于一些事情,所有细节都在C++标准[dcl.init]中详细说明。
根据存储时间、各种类型的构造函数的存在等,其中的各个部分最终都是默认初始化、零初始化或值初始化。
默认初始化意味着整个变量将是一些任意值,而零初始化则会初始化所有成员,并将填充字节设置为零。
因此,Data d1;和static Data d2;不一定有相同的填充字节。
值初始化要复杂一些,因为它在调用构造函数(如果存在的话)之前首先有效地选择了默认或零初始化。
但底线是,这可能并不重要。如果填充的内容很重要,您应该将该空间“注册”为真正的成员变量,以便您可以使用它们(并使它们正确初始化)。填充在变量的“值”中非常不重要,除非您做了一些疯狂的事情,比如memcmp,或者对它占用的整个内存块运行校验和:)
发布于 2019-12-30 10:04:43
我一直认为它是不可预测的,但在结构的对象有静态存储持续时间的情况下仍然不确定。
因此,我搜索了C标准和C++标准中是否明确提到了这一点(因为您使用的是C和C++)。
It 是C标准(C99、C11和C18)中提到的:
J.1未指定的行为
对于C++,我无法发现在C++标准中任何地方都提到过它。
https://stackoverflow.com/questions/59528237
复制相似问题