簡體   English   中英

枚舉可以減少到C ++的位大小嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM