C ++联合/结构位域实现和可移植性

时间:2018-10-31 00:39:42

标签: c++ c++11 struct unions

我有一个包含uint16和这样的结构的联合:

union pData {
    uint16_t w1;
    struct {
        uint8_t d1 : 8;
        uint8_t d2 : 4;
        bool b1 : 1;
        bool b2 : 1;
        bool b3 : 1;
        bool b4 : 1;
    } bits;
};

我的同事说,这种便携式产品存在问题,但是我不确定我是否会购买。可以请一些人解释(尽可能简单)什么是“错误的”吗?

2 个答案:

答案 0 :(得分:4)

C++17 12.2.4 Bit-fields /1(以及C++11 9.6 Bit-fields /1出发,如果您想为所选标签提供 specific 的答案)

  

在类对象中的位域分配是 实现定义的。 。位域的对齐方式是 实现定义的。 位域打包到某个可寻址的分配单元中。 [请注意:位域跨越 某些计算机上的分配单位,而不是其他计算机上的 。位域在某些计算机上从右到左分配 ,从左到右。 -尾注]

依赖于实现定义的行为,就其本质而言,意味着不可移植的代码。

答案 1 :(得分:1)

也许您的同事猜测您打算写w1并从bits读,反之亦然。

那将是不确定的行为。在C ++中,union中只有一个成员可以随时活动;写入成员使其处于活动状态,而读取非活动成员的行为是不确定的。