[英]Can an enum be reduced to its bit size in C++?
給定以下內容-我可以將sizeof(A)
設為1
嗎? 現在我的數據是8
,但是我希望A
布局與Z
相等-因為枚舉只有一點數據。
enum BOOL { x , y};
struct A {
BOOL b : 1;
unsigned char c : 7;
};
struct Z {
unsigned char r : 1;
unsigned char c : 7;
};
int main()
{
A b;
b.b = x;
std::cout << b.b << "," << sizeof(A) << ","<< sizeof(Z) << std::endl;
return 0;
}
這里的問題是,默認情況下, BOOL
將使用int
作為基礎類型。 由於它使用int
,因此會將結構填充為8
的大小,因為這將使結構的int
部分保持良好對齊。
但是,您可以執行的操作是指定您不想要int
,而是想要一個unsigned char
以便它可以將兩個位域打包在一個成員中。 這不能保證,但很有可能發生。 使用
enum BOOL : unsigned char { x , y};
使A
在GCC,Clang和MSVC中的大小為1
您可以將bool用作枚舉的基礎類型:
enum BOOL : bool { x , y};
鑒於此, 在我的系統上 , sizeof(A)
為1。考慮到定義了很多位字段結構,並且在技術上不能保證bool
本身具有大小1,因此我不認為這是可以保證的。
使用unsigned char
是另一種選擇,在某些實現中,使用相鄰的unsigned char
位域成員可能會更好地進行處理。 但是,不幸的是,例如GCC warning: 'A::b' is too small to hold all values of 'enum BOOL'
,從技術上講是誤報,因為一位足以代表0和1。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.