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

xBA*_*ACP 2 c++ struct unions c++11

我有一个包含 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;
};
Run Code Online (Sandbox Code Playgroud)

我的同事说这个便携有问题,但我不确定我买这个。可以请一些人解释(尽可能简单)这里的“错误”是什么?

pax*_*blo 5

来自C++17 12.2.4 Bit-fields /1(并且C++11 9.6 Bit-fields /1就此而言,如果您想要特定于您选择的标签的答案):

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

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