读取和写入结构的填充位

reading and writing in the padding bits of a structure

本文关键字:填充 结构 读取      更新时间:2023-10-16

我有以下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是非并集类类型、每个非静态数据成员和每个基类子对象初始化为零,填充初始化为零位

然而,我在微软编译器(vc++v120)中没有看到这种行为,例如:

reinterpret_cast<std::uint32_t&>(y) == 0u

不评估为CCD_ 3。这可能是一个缺失的功能,或者我误解了标准中的短语。

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

对于除了转换回原始指针之外的任何事情,都不定义使用repret_cast的行为。interpret_cast表示您在代码中做了一些不可靠的事情。

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