2011-11-01 124 views
6

布爾測試;如何將bool類型變量存儲在內存中? (C++)

sizeof(test) = 1如果使用VS 2010.因爲每個C++數據類型都必須是可尋址的,所以「test」bool變量是8位(1字節)。

我的問題是,「測試」變量真的佔用內存中的1個字節嗎?

有沒有什麼實現技巧可以讓bool數據類型只佔用 一點?如果是的話,你能舉個例子嗎?

bool test1[32](在VS 2010), int test2(在VS 2010)

test1test2佔用相同的內存?

+0

我要強調,這可能是合理的一個平臺,在4個字節存儲在一個32位的布爾當超速優化時,然後,如果在一個結構中有4個布爾值,那麼只需要一個ALU操作來檢查bool是否爲真,相比之下,當一個機器字中包含許多布爾值時。 (Ofc這麼小的差別通常並不重要)。 – Kos

+0

一些嵌入式處理器實際上具有位尋址內存,所以bool變量可以佔用一位。 –

回答

8

test1的每個元素必須是可尋址的。這意味着test1需要至少32 字節(而不是位)。

如果需要多個布爾值存儲在一個變量,使用std::bitsetstd::vector<bool>(但要注意的是,後者是沒有真正的bool的載體,它的目的是節省空間的專業化)。

IIRC,C++ 11還定義了std::dynamic_bitset

+3

你可能意思是32位,而不是字節 – Milan

+1

如果處理器有8位可尋址單元,那意味着「bool」必須佔用1個字節(字節),而不是4個(32位)。是的,這裏仍然有8位可尋址系統。 ARM9可以訪問8或32位值。 –

+2

@ entity64:'test1'是32個可尋址的'bool'對象的數組,每個對象需要(至少)32個字節。 –

3

我的問題是,「測試」變量真的佔用內存中的1個字節嗎?

是的,如果sizeof(bool)==1。基本上,sizeof bool是實現定義的,這意味着對於某些編譯器它可能大於1個字節。

布爾TEST1 [32](2010年VS),INT TEST2(2010年VS)
不TEST1和TEST2佔用相同的存儲器?

它們各自佔用的東西可以通過使用sizeof運算符來知道。這就是運營商的規模。因此test1test2將分別佔用sizeof(test1)sizeof(test2)字節

2

另一種可能性有1位的變量,是投入到一個位域結構:

struct { 
    int a:1; 
    int b:1; 
}; 
+0

不應該是'unsigned a:1'嗎? – Xeo

+0

嗯,我確定我是這樣使用它的,儘管我從來沒有把它看作一個1位有符號整數,所以你在這裏有一個觀點。 –

相關問題