【问题标题】:reading and writing in the padding bits of a structure读取和写入结构的填充位
【发布时间】: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


【解决方案1】:

我不是填充方面的专家,但我认为不可能保证任何填充,至少在没有特殊且可能特定于实现的选项的情况下是不可能的。

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

这个问题讨论了填充被初始化为什么 Is zero initialization of structures guaranteed to wipe padded areas?

【讨论】:

  • 我认为他不想保证填充存在,因为如果填充存在,则没有未定义的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2016-09-04
  • 2014-07-01
  • 1970-01-01
相关资源
最近更新 更多