簡體   English   中英

有效使用位域和聯合

[英]Valid use of bit-fields and unions

我寫這個代碼只是為了好玩:

union {
    struct {
        bool a : 1;
        bool b : 1;
        bool c : 1;
        bool d : 1;
        bool e : 1;
        bool f : 1;
        bool g : 1;
        bool h : 1;
    } a;
    uint8_t b;
} uni {0}; // sets .a bits to false

// union size  : 1 byte

我可以分別切換每個位:

uni.a.a = true;
uni.a.d = true;

cout << bitset<8>(uni.b) << endl; // Prints 000010001

並且還使用位掩碼:

uni.b = 0b00001000;

if(uni.a.a) cout << "a";
if(uni.a.b) cout << "b";
if(uni.a.c) cout << "c";
if(uni.a.d) cout << "d";
if(uni.a.e) cout << "e";
if(uni.a.f) cout << "f";
if(uni.a.g) cout << "g";
if(uni.a.h) cout << "h";
// prints 'd'

我知道還有其他方法可以執行此操作(按位操作),但是我喜歡這種設計。 我的問題是: 就可靠性和性能而言,這是否很好地利用了位域和聯合?

我的問題是:就可靠性和性能而言,這是否很好地利用了位域和聯合?

就性能而言,至少在以位級別訪問內存方面,您正在做的事情可能會達到預期的效果。

就可靠性而言,在大多數現代系統中可能都可以。 冒着聽起來像語言律師的風險,在某些方面,跨系統可能會產生不同的結果:

  1. sizeof(bool)不能保證為1,即bool可以存儲在大於一個字節的內存中。 我不知道bool不是字節大小的現代系統,但是您可以想象一個較舊或較差的實現會使boolint大小相同。 這天生就會使你的union
  2. 訪問的不同成員變量union能引起未定義行為
  3. 跨系統的字節順序可以不同(例如,大或小字節序),從而導致union成員代表MSB的差異。
  4. 從技術上講,該實現可以按字節順序以任意順序布置位字段的各個位。 我知道的每個實現都會按照您在struct定義的順序對它們進行排序,但這不是必須的。
  5. 該實現可以在struct各個成員之間插入填充,以使各個位位於內存的不同字節中。 同樣,我所知道的所有實現都不會這樣做,但是可能會發生。

我認為您不必擔心上述問題。 但是,就涵蓋可能出錯的所有內容而言,我認為上面的列表很好地涵蓋了如果您真正尋找實現有所不同的實現可能遇到的真正奇怪的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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