2
#include<stdio.h>
static struct s
{

    unsigned a:5;
    unsigned b:5;
    unsigned c:5;    
    unsigned d:5;

}v={1,2,3,4};

int main()
{
    printf("size of v = %d\n",sizeof(v));
}

“答案是 4”。我无法解释这个输出。

#include<stdio.h>
static struct s
{

    unsigned a:5;
    unsigned b:5;

}v={1,2};

int main()
{
    printf("size of v = %d\n",sizeof(v));
}

“答案仍然是 4” .. 位域如何影响结构大小?

4

4 回答 4

4

默认情况下,gcc 在字节边界上对齐数据,在某些平台(尤其是 RISC)上,在机器字边界上对齐数据。这是因为非字节对齐的读取(在 RISC 机器上)会导致异常,从而减慢程序的速度。这就是为什么每个字段都存储在自己的字节中的原因,即使它们只有 5 位长。为了正确包装,请使用__attribute__((packed))

#include<stdio.h>

static struct s
{
    unsigned a:5 __attribute__((packed));
    unsigned b:5 __attribute__((packed));
}v={1,2};

int main()
{
    printf("size of v = %d\n",sizeof(v));
}

这个的输出是:

size of v = 2

这是预期的,因为您总共有 10 个字节,大小向上舍入到下一个字节。

于 2013-06-16T11:52:26.917 回答
2

如果您将用作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;
};

位域ab位于 8 位容器中。位域cd在一个 8 位容器中,位域e在一个 8 位容器中,总共 24 位。

于 2013-06-16T12:04:47.053 回答
1

简单,因为处理器喜欢 4(AKA数据对齐

于 2013-06-16T11:55:05.723 回答
0

C 编译器使用单个 unsigned int 作为位字段的存储。并且因为 unsigned int 是 4 个字节长,所以结构的大小也不可避免地是 4 个字节。

于 2013-06-16T11:54:00.783 回答