枚举可以减少到C ++的位大小吗?

时间:2019-06-04 14:04:44

标签: 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;
}

2 个答案:

答案 0 :(得分:6)

这里的问题是BOOL将默认使用int作为基础类型。由于它使用int,因此会将结构填充为8的大小,因为这将使结构的int部分保持良好对齐。

您可以执行的操作是指定您不希望使用int,而是希望使用unsigned char,以便可以将两个位域打包到一个成员中。这不能保证,但很有可能发生。使用

enum BOOL : unsigned char { x , y};

在GCC,Clang和MSVC中,A的大小为1

答案 1 :(得分: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。