具有位字段的结构的大小

时间:2014-07-13 17:09:29

标签: c bit-fields

这里我有一段代码片段。

#include <stdio.h>
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字段,所以会喜欢一些帮助。谢谢。 :)

3 个答案:

答案 0 :(得分:4)

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

  

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

答案 1 :(得分:4)

当你告诉C编译器时:

int bit1 : 1

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

因此,如果我们考虑您的代码:

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

你告诉编译器是这样的:取int必要数,并将块1称为bit1,然后参考位2 - 5为bit2,然后将第6 - 9位称为bit3

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

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

答案 2 :(得分:-1)

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

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