c++ - 什么值存储在对齐的结构/类对象的填充字节中
问题描述
struct Data
{
std::uint32_t b;
char a;
};
Data 类型按 4 个字节对齐,因此 sizeof(Data) == 8。
但是第 5-7 个字节中的值是多少?它是默认零吗?
解决方案
它实际上取决于一些东西,所有这些都在 C++ 标准中有详细说明[dcl.init]
。
根据存储持续时间、各种类型的构造函数的存在等,最终的各个部分要么是默认初始化,要么是零初始化或值初始化。
默认初始化意味着整个变量将是某个任意值,而零初始化零初始化所有成员并将填充字节设置为零。
所以Data d1;
和static Data d2;
不一定有相同的填充字节。
值初始化有点复杂,因为它在调用构造函数(如果存在)之前有效地首先选择默认或零初始化。
但最重要的是,这可能无关紧要。如果填充的内容很重要,您应该将该空间“注册”为真正的成员变量,以便您可以使用它们(并正确初始化它们)。填充在变量的“值”中非常不重要,除非你做了一些疯狂的memcmp
事情,或者在它占据的整个内存块上运行校验和:-)
推荐阅读
- azure - Azure.Storage.Blobs.BlobServiceClient CopyFromUri() 在返回最新的 ETag 之前似乎没有完成复制
- javascript - JS:不确定为什么函数返回
- reactjs - 从域调用时,Firebase 函数不执行
- python - Python WebScraping FlashScore
- ios - 如何使用附加数据将 apns 令牌发送到服务器
- python - 我怎样才能将我的整数输入分成 2 位数字,剩下的一位数字为一位?
- c# - C# .NET core 3 MVC 脚手架与 EntityFrameworkCore
- django - Django:tinymce HTML 格式
- reactjs - 定义回调参考 TypeScript 和 react-slick 库
- python - 为什么我的代码真的很慢,我该如何改进它?