【发布时间】:2013-08-24 13:51:15
【问题描述】:
我有以下 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 是 非联合类类型,每个非静态数据成员和每个基类 子对象初始化为零,填充初始化为零位
但是,我在 Microsoft 编译器 (vc++ v120) 中没有看到这种行为,例如:
reinterpret_cast<std::uint32_t&>(y) == 0u
不会评估为true。这可能是缺少的功能,或者我误解了标准中的短语。
【问题讨论】:
-
y在这种情况下不是零初始化的,而是值初始化的。初始化规则非常不直观且令人困惑。 -
话虽如此,我来这里是为了找到你问题第一部分的答案:(很遗憾这里没有答案
标签: c++ casting padding undefined-behavior