我有以下 32 位对齐结构和必要的填充,以确保i32
数据成员的 32 位对齐:
struct
{
std::uint8_t i8;
std::uint32_t i32;
} x, y = {0};
写入填充位是否具有明确定义的行为?例如,在代码中:
reinterpret_cast<std::uint32_t&>(x) = 256u;
填充部分是否总是写和读为 1?
另一个问题:
填充是否始终初始化为 0 y
?
我理解 C++ [dcl.init]状态:
对 T 类型的对象或引用进行零初始化意味着:如果 T 是非联合类类型,则每个非静态数据成员和每个基类子对象都被零初始化,填充被初始化为零位
但是,我在 Microsoft 编译器 (vc++ v120) 中没有看到这种行为,例如:
reinterpret_cast<std::uint32_t&>(y) == 0u
不评估为true
. 它可能是缺少的功能,或者我误解了标准中的短语。