鉴于以下几点-我可以让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;
}
答案 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。