2009-11-20 60 views
4

比方說,我需要存儲8級的bool在一個結構,但我想他們只使用1個字節在一起,然後我可以做這樣的事情:作爲位域的C++布爾數組?

struct myStruct { 
    bool b1:1; 
    bool b2:1; 
    bool b3:1; 
    bool b4:1; 
    bool b5:1; 
    bool b6:1; 
    bool b7:1; 
    bool b8:1; 
}; 

以及與此我可以做的事情一樣

myStruct asdf; 
asdf.b3=true; 
asdf.b4=false; 
if(asdf.b1) 
    ... 

到目前爲止這是否正確? (我不知道它實際上,我從來沒有使用位域之前)

好 - 但它也有可能創建一個8布爾靜態數組,使他們將只使用8位,但我仍然可以地址他們通過索引?

struct myStruct { 
public: 
    bool b[8]:8; 
}; 

可能? (與此,我得到一個錯誤C2033)

感謝您的幫助!

回答

10

我會建議使用一個std::bitset這樣,你可以簡單地聲明:

std::bitset<8> asdf; 

,並用[]使用它。

asdf[0] = true; 
asdf[3] = false; 
+2

如果我的研究是正確的,bitset使用至少4個字節 – Mat 2009-11-20 19:10:47

+0

作爲T.E.D.指出,在考慮到對齊問題時,任何數據結構都會佔用32位的可能性很大。 – 2009-11-20 19:24:33

+1

有一些很好的鏈接來解釋另一個問題中的對齊問題:http://stackoverflow.com/questions/381244/purpose-of-memory-alignment – 2009-11-20 19:59:26

1

難道你寧願使用一個byte數據類型來一次保存所有內容嗎?那麼你只需要使用邏輯AND s和OR s來獲取/放入東西。不需要struct

0

由於各種原因,我不認爲這是一個好主意 - 你基本上試圖複製已被證明爲not a good idea的行爲vector<bool>。如果你只是爲了節省內存而試圖做到這一點,那我就不用擔心了。訪問各種bools並從位域中提取它們的開銷可能比存儲的內存少得多,除非你受限於內存極限。

要回答你的直接問題,如果你想要做bool/bitfield的事情,你必須使用你的第一種方法。

通常情況下,位域/位旋轉方法的合法和可接受的用途是當您必須處理硬件寄存器並嘗試對硬件寄存器建模或實際訪問硬件寄存器後使其看起來像內存位置和在寄存器上疊加一個位域結構。

+1

嘿!是的,這是關於記憶。問題是,我必須在堆上創建許多這些對象,並且它接縫的大小會影響我的應用程序的線性性能。將其從64字節減少到36倍以上。所以現在我正在尋找方法來進一步減小尺寸 – Mat 2009-11-20 18:47:32

-1

你或許可以讓你的編譯器做你想做的事,但遺憾的是這不是必需的。例如,即使是一個接受上述的編譯器,也可能最終會爲您的myStruct對象分配一個完整的32位字。

如果您有選擇,並且您希望對您的類型進行控制以及它們如何對齊和分配,那麼您應該考慮使用Ada。例如,下面的工作只是在阿達罰款:

type Bit_Set is array (1..8) of Boolean; 
for Bit_Set'size use 8; 

High_Mask : constant Bit_Set := (1..7 => false, 8 => true); 

...你現在有一個單字節位掩碼,以及運營商「和」,「或」,「異或」等的工作按位與它。

+1

+1用於提高對準問題; -1用於提示編程語言的改變。淨0 :) – lavinio 2009-11-20 18:59:12

+0

不夠公平。我只是因爲C的侷限性而感到非常沮喪,我不得不提及它們並不是祕密。 – 2009-11-20 20:25:11

+0

問題*標題*特別要求提供C++解決方案 – Holger 2012-03-09 13:43:42