2012-04-21 72 views
4

我有一系列需要許多布爾字段的類,大約在4-10之間。我想不必爲每個布爾值使用一個字節。我一直在尋找到位字段結構,是這樣的:布爾比特字段vs邏輯比特屏蔽或比特移位 - C++

struct BooleanBitFields 
    { 
     bool b1:1; 
     bool b2:1; 
     bool b3:1; 
     bool b4:1; 
     bool b5:1; 
     bool b6:1; 
    }; 

但做了一些研究,我看到很多人說,這可能會導致低效的內存訪問和不值得節省內存後。我想知道這種情況的最佳方法是什麼。我應該使用位字段,還是使用帶位掩碼的字符(和/或 )來存儲8位?如果第二種解決方案更適合移位或使用邏輯?

如果任何人都可以評論他們會使用什麼方法,爲什麼它會真正幫助我決定我應該走哪條路線。

在此先感謝!

+4

您應該使用任何對您更爲方便的方法,除非您有硬性數據表明這種選擇會以可觀察的方式影響應用程序的性能。 – Jon 2012-04-21 18:58:23

+0

http://stackoverflow.com/questions/2638015/how-slow-are-bit-fields-in-c
位域只會爲你做掩蓋。 – ssteinberg 2012-04-21 18:59:14

+0

那麼其他職位是正確的話題,但它似乎仍然沒有直接回答這個問題。 :( – 2012-04-21 19:05:46

回答

2

隨着桌面盒大的地址空間,一系列32/64位布爾值可能看起來很浪費,而且確實如此,但大多數開發人員並不在意(包括我在內)。在限制RAM的嵌入式控制器上,或者當訪問驅動程序中的硬件時,請確保使用位域,否則..

除R/W易用性/速度外,還有一個問題是32位或64位布爾值比中間的一位必須被多個邏輯操作操縱的線程更安全。

1

使用int位陣列(讓你大量的空間擴大,並沒有什麼優勢,單字符)和測試用面膜常量:

#define BOOL_A 1 
#define BOOL_B 1 << 1 
#define BOOL_C 1 << 2 
#define BOOL_D 1 << 3 

/* Alternately: use const ints for encapsulation */  

// declare and set 
int bitray = 0 | BOOL_B | BOOL_D; 

// test 
if (bitray & BOOL_B) cout << "Set!\n"; 
+0

感謝goldilocks。你有任何r在位字段選擇這種方法的性能? – 2012-04-21 19:06:51

+0

**是**位字段,它只是沒有聲明爲具有命名成員的結構。相反,使用命名常量。這對我來說似乎更簡單和更整齊(並且更規範)。唯一的缺點是你必須小心這些名字,因爲它們在全球空間。由於MYFIELD_VALUEA類似於MyField :: ValueA,所以賦予它們所有相同的前綴是常規解決方案。我猜你也可以在這裏使用const ints。 – delicateLatticeworkFever 2012-04-21 19:47:53

+0

使用const ints而不是defined可以實現更好的封裝,但可能會導致性能下降。 – delicateLatticeworkFever 2012-04-21 19:54:21

2

位字段只是編譯器的建議。編譯器可以自由實現它們,因爲它喜歡。在嵌入式系統中,有編譯器可以保證1位到位的映射。其他編譯器不。

我會去一個普通的結構,像你的,但沒有位域。使它們成爲無符號字符 - 最短的數據類型。如果您的IDE支持自動完成,那麼該結構將使編輯時更容易訪問它們。

+0

也表述爲「實現可以分配足夠大的任何可尋址存儲單元來容納位域」。 - ISO C11§6.7.2.1 – 2017-10-14 07:44:53