簡體   English   中英

C ++聯合/結構位域實現和可移植性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM