2

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

4

1 回答 1

0

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

除了转换回原始指针之外,将 reinterpret_cast 用于任何其他事情都不是定义的行为。reinterpret_cast 意味着你在你的代码中做了一些狡猾的事情。

这个问题讨论了填充被初始化 为什么结构的零初始化保证擦除填充区域?

于 2013-08-22T01:45:40.663 回答