读取和写入结构的填充位

时间:2013-08-22 01:16:55

标签: c++ casting padding undefined-behavior

我有以下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。这可能是一个缺失的功能,或者我误解了标准中的短语。

1 个答案:

答案 0 :(得分:0)

我不是填充专家,但我不相信可以保证任何填充,至少没有特殊的,可能是特定于实现的选项。

将reinterpret_cast用于转换回原始指针以外的任何内容都没有定义行为。 reinterpret_cast意味着你在代码中做了一些狡猾的事情。

此问题讨论了初始化填充的内容 Is zero initialization of structures guaranteed to wipe padded areas?