2015-10-07 29 views
0

假設我有以下枚舉某處聲明:在C++中,枚舉數據類型消耗多少內存?

enum yin_yang { 
    yin, 
    yang 
}; 

我希望使用新的數據類型,像這樣:

yin_yang balance = yang; 

如何系統內存的多少將「平衡」被佔用? 1位,1個字節或其他東西?

+1

[無論包含多少元素,枚舉的大小都是恆定的可能重複](http://stackoverflow.com/questions/17888322/size-of-en-um-is-constant-no-matter-how-many -element-it-contains) –

+1

用'cout << sizeof(yin_yang)<< endl;' – Klaus

+0

檢出它你可以排除它只消耗一個位的可能性。 'sizeof(yin_yang)'必須至少有一個,即'char'的大小,'char'必須多於一個位。 – skyking

回答

3

無論是實際佔用內存取決於你的代碼優化做什麼,但如果你想知道一個類型或對象的字節大小,您可以使用sizeof操作:

std::cout << sizeof(yin_yang) << std::endl; 
std::cout << sizeof(balance) << std::endl; 

這並不意味着balance實際上必須在運行時佔用內存空間。它可以完全優化。但是在編譯時會知道對象的大小。

+1

是的,雖然編譯器可以完全優化值但仍然打印它所謂的大小 –

2

至少在C++ 11,可以指定要用作枚舉的基礎使用整數型:

enum yin_yang : uint8_t { 
    yin, 
    yang 
}; 

否則編譯器選擇的基本類型,這將是一個整數類型,雖然沒有指定哪個IIRC(我相信許多編譯器默認爲int)。基本類型決定了枚舉實例的存儲需求。

+0

編譯器可以自由選擇不大於'int'的任何類型。 – legends2k

0

您可以使用一元運算符'sizeof'來計算以字節大小單位數量度量的任何變量或數據類型的大小。

0

對於範圍的枚舉,從C++ 14中摘錄的相關部分,[decl.enum]

對於枚舉其基礎類型是不固定的,基本類型是整數類型可以表示枚舉中定義的所有枚舉值。如果沒有整型可以表示所有的枚舉值,則枚舉是不合格的。它是由實現定義的,其中整數類型用作基礎類型,除非基礎類型不應大於int,除非枚舉器的值不適合intunsigned int。如果枚舉器列表爲空,則基礎類型就好像該枚舉具有值爲0的單個枚舉器。

因此,如果列舉美國在int那麼它是保證≤sizeof(int),更大的如果不是有表示的。當然,如果你明確指定了底層類型,那麼你就知道它的大小。