具有位字段的结构的大小

这里我有一个代码片段。

#include  int main() { struct value { int bit1 : 1; int bit2 : 4; int bit3 : 4; } bit; printf("%d",sizeof(bit)); return 0; } 

我得到输出为4(32位编译器)。 谁能解释我怎么样? 为什么不是1 + 4 + 4 = 9? 我之前从未使用过bit字段,所以会喜欢一些帮助。 谢谢。 🙂

当你告诉C编译器时:

 int bit1 : 1 

它将其解释为并为其分配一个整数; 但是它的第一位是bit1

所以如果我们考虑你的代码:

 struct value { int bit1 : 1; int bit2 : 4; int bit3 : 4; } bit; 

你告诉编译器的是:获取必要数量int ,并将块1作为bit1引用,然后将bit 2 – 5称为bit2 ,然后将bit 6 – 9称为bit3

由于所需的完整位数为9,而int为32位(在计算机的体系结构中),因此只需要1个int内存空间。 因此,您获得4(字节)的大小。

相反,如果您使用char定义struct ,因为char是8位,编译器将为每个struct value分配两个char的内存空间。 并且您将得到2(字节)作为输出。

因为C请求将位打包在同一个单元中(这里有一个signed int / unsigned int ):

(C99,6.7.2.1p10)“如果剩余足够的空间,则紧跟在结构中另一个位域之后的位域应被打包到同一单元的相邻位中”

处理器只喜欢一次性吸收大约32位 – 而不是9,34等。

它只是将其归结为处理器所喜欢的内容。 (让工人高兴)