我有一个包含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;
};
我的同事说,这种便携式产品存在问题,但是我不确定我是否会购买。可以请一些人解释(尽可能简单)什么是“错误的”吗?
答案 0 :(得分:4)
从C++17 12.2.4 Bit-fields /1
(以及C++11 9.6 Bit-fields /1
出发,如果您想为所选标签提供 specific 的答案)
在类对象中的位域分配是 实现定义的。 。位域的对齐方式是 实现定义的。 位域打包到某个可寻址的分配单元中。 [请注意:位域跨越 某些计算机上的分配单位,而不是其他计算机上的 。位域在某些计算机上从右到左分配 ,从左到右。 -尾注]
依赖于实现定义的行为,就其本质而言,意味着不可移植的代码。
答案 1 :(得分:1)
也许您的同事猜测您打算写w1
并从bits
读,反之亦然。
那将是不确定的行为。在C ++中,union
中只有一个成员可以随时活动;写入成员使其处于活动状态,而读取非活动成员的行为是不确定的。