[英]C++ Union/Struct Bitfield Implementation and Portability
我有一個包含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;
};
我的同事說,這種便攜式產品存在問題,但是我不確定我是否會購買。 可以請一些人解釋(盡可能簡單)什么是“錯誤的”嗎?
從C++17 12.2.4 Bit-fields /1
(和C++11 9.6 Bit-fields /1
,如果您想要特定於所選標簽的答案):
類對象內的位域分配由實現定義。 位域的對齊是實現定義的。 位字段打包到一些可尋址的分配單元中。 [注意:位域跨越某些機器上的分配單元, 而不是在其他機器上。 在某些計算機上,位字段是從右到左分配的,在其他計算機上是從左到右分配的。 -尾注]
依賴於實現定義的行為,就其本質而言,意味着不可移植的代碼。
也許您的同事猜測您打算寫入w1
並從bits
讀取,反之亦然。
那將是不確定的行為。 在C ++中, union
只有一個成員可以隨時處於活動狀態 ; 寫入成員使其處於活動狀態,而讀取非活動成員的行為是不確定的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.