我有以下32位对齐结构和必要的填充,以确保i32
数据成员的32位对齐:
struct
{
std::uint8_t i8;
std::uint32_t i32;
} x, y = {0};
填充位中的写入是否有明确定义的行为?例如,在代码中:
reinterpret_cast<std::uint32_t&>(x) = 256u;
填充部分总是写入并读为1?
另一个问题:
y
的填充是否始终初始化为0?
我理解为C ++ [dcl.init] 状态:
零初始化T类型的对象或引用意味着:如果T是a 非联合类类型,每个非静态数据成员和每个基类 子对象零初始化,填充初始化为零位
但是,我没有在Microsoft编译器(vc ++ v120)中看到此行为,例如:
reinterpret_cast<std::uint32_t&>(y) == 0u
未评估为true
。这可能是一个缺失的功能,或者我误解了标准中的短语。
答案 0 :(得分:0)
我不是填充专家,但我不相信可以保证任何填充,至少没有特殊的,可能是特定于实现的选项。
将reinterpret_cast用于转换回原始指针以外的任何内容都没有定义行为。 reinterpret_cast意味着你在代码中做了一些狡猾的事情。
此问题讨论了初始化填充的内容 Is zero initialization of structures guaranteed to wipe padded areas?