具有位域的struct的大小

h4c*_*k3d 1 c struct

    static struct{
            unsigned a:5;
            unsigned b:5;
            unsigned c:5;
            unsigned d:5;
    }v={1,2,3,4};

    printf("%d %d %d %d %d",v.a,v.b,v.c,v.d,sizeof(v));
Run Code Online (Sandbox Code Playgroud)

输出为:1 2 3 4 4

有人可以解释为什么这个结构4的大小?不应该是16吗?

cni*_*tar 10

您正在使用20位,恰好适合4个字节.不需要16个字节.

编辑

我认为它实际上需要像这样包装:

6.7.2.1

实现可以分配足够大的任何可寻址存储单元以保持比特字段.如果剩余足够的空间,则紧跟在结构中另一个位字段之后的位字段将被打包到同一单元的相邻位


Som*_*ude 6

Bitfields打包了这个位,因此你的20位很适合32位int,而不是四种不同的int.