如果您将用作unsigned char
位字段的类型,您将分别获得大小 4 和大小 2。的对齐方式和大小struct
通常由位域的整数类型决定。结构的打包,尤其是位字段的打包,是高度实现定义的,但由 6.7.2.1 ad 11 规定
实现可以分配任何大到足以容纳位字段的可寻址存储单元。如果有足够的空间,结构中紧跟在另一个位域之后的位域将被打包到同一单元的相邻位中。如果剩余空间不足,则将不适合的位域放入下一个单元还是与相邻单元重叠是实现定义的。单元内位域的分配顺序(高位到低位或低位到高位)是实现定义的。未指定可寻址存储单元的对齐方式。
大多数编译器使用与位域一起给出的整数类型作为“可寻址存储单元”。
另请注意,结构打包通常被指定为架构的应用程序二进制接口 (ABI) 的一部分,以确保此架构的编译器的互操作性。
假设 x86 架构的 GCC 编译器,详细说明您的示例。
struct
{ unsigned int a:5;
unsigned int b:5;
unsigned int c:5;
unsigned int d:5;
};
四个位域位于 32 位容器的前 20 位中。
struct
{ unsigned char a:5;
unsigned char b:5;
unsigned char c:5;
unsigned char d:5;
};
每个位域都位于其自己的 8 位容器中,因此也是 32 位。
struct
{ unsigned int a:5;
unsigned int b:5;
};
位域位于 32 位容器的前 10 位,因此整个结构仍然是 32 位。
struct
{ unsigned char a:5;
unsigned char b:5;
};
两个位域都位于各自的 8 位容器中,因此整个结构是 16 位的。
struct
{ unsigned char a:5;
unsigned char b:3;
unsigned char c:3;
unsigned char d:5;
unsigned char e:5;
};
位域a
,b
位于 8 位容器中。位域c
和d
在一个 8 位容器中,位域e
在一个 8 位容器中,总共 24 位。