2013-10-13 25 views
6

如已經討論的in the docs,數據類型至少佔用一個字節的存儲器。類似的問題,有人問這之前(How a bool type variable is stored in memory? (C++)),但這種討論和文檔似乎只討論一個布爾數據類型所佔用的空間量,而不是實際發生內存當我這樣做:bool如何在內存中表示?

bool b = true;

那麼在內存中究竟發生了什麼?沒有用於存儲這些信息的7位會發生什麼?標準是否規定了這個行爲?

它們是不確定的嗎?或者在C++總部有人做這樣的事情:

enum bool : char 
{ 
    false = 0, 
    true = 1 
}; 
+0

的【如何bool類型變量存儲在內存中可能重複? (C++)](http://stackoverflow.com/questions/7967924/how-a-bool-type-variable-is-stored-in-memory-c) –

+1

@ DanielA.White我鏈接到這篇文章,並沒有解決這個問題。我對內存中發生的事情感興趣,而不是佔用多少空間以及在哪個平臺上。 – arman

回答

9

標準指出bool值表現爲整數類型,但它沒有在存儲器中指定它們的具體表示:

bool類型的值可以是truefalse如下所述,bool值表現爲。積分類型。bool類型的值參加積分優惠「〜C++ 03 3.9.1§6

」一種用於整體式的同義詞是整數類型。整型的表述應使用純二進制記數系統」〜C++ 03 3.9.1§7

的定義值然而,它定義了積分的推廣從boolint

」類型bool的右值可以轉換爲類型爲int的右值,其中false變爲零並且true成爲一個。這些轉換稱爲積分優惠 「〜C++ 03 4.5§4-5

以及來自其它類型轉換爲bool

」。零值,空指針值,或空成員指針值轉換爲false;任何其他值轉換爲true。「〜C++ 03 4。12§1

+0

C++ 14指定'bool' *是一個整數類型,並使用純二進制計數系統,儘管它仍然沒有明確說明它的含義。我們可能期望'false'具有與'0'相同的表示,'true'具有'1'的表示,但實際上並不這麼說。 –

4

該標準沒有強制任何bools的二進制表示;它只是說,轉換爲其他整數類型時,一個true布爾將成爲1和false布爾將變成0

當然,這意味着在本質上與一個你說的,其中這種轉換將成爲類似的實現基本上沒有操作或純整數加寬(但請記住bool被規定爲原始類型,而不是枚舉類型)。

-1

我幾個月沒有用C++編寫程序,但AFAIR規則如下: 0 - false; 任何不同於0的值 - 真; (默認情況下,它是1,但如果將AFAIR從其他整數值轉換爲AFAIR,則例2將被視爲真)。

因此,你可以說,在某種程度上浪費內存(人太多)是C++,因爲它可能只使用一個位,但它更簡單,使編譯器即可。

在C++中,你還可以定義位字段(bit fields in wikipedia)但它不經常使用。

+0

小心 - 什麼'bool'類型存儲的,什麼是真'的'一個條件指令的概念是不同的東西... –

1

您可以通過複製的記憶,忽略其類型,它測試這樣的事情。該程序讀取test_bool的原始內存值並將其存入test_int中,以便您可以打印它。

int test_int = 0; 
bool test_bool; 

test_bool = true; 
memcpy (&test_int, &test_bool, sizeof(bool)); 
printf ("True value is: %d\n", test_int); 

test_bool = false; 
memcpy (&test_int, &test_bool, sizeof(bool)); 
printf ("False value is: %d\n", test_int); 

對於我來說,這個計劃讓:

True value is: 1 
False value is: 0 
+0

這將是更有意義的'bool'複製到'char'(或更好,到一個char [sizeof(bool)]'),否則對這個被覆蓋的「int」的解釋可能會因其他問題而變得複雜(在一個32位的big-endian機器上,'true'被存儲爲一個單字節1,例如,你的代碼會輸出16777216)。 –

+0

是的,可能最好使用與bool相同大小的類型。 – Atle