#include <stdio.h>
struct node
{
unsigned color : 2;
};
void main()
{
struct node n;
n.color = 1;
printf("size is :%d\n", (int)sizeof(n));
}
编译器如何为这种类型的分配分配内存?
printf给出的输出大小为:4
答案 0 :(得分:2)
编译器通常在结构的两个成员之间分配一些空白空间,以便更快地访问每个成员。这称为填充。对齐的大小主要取决于处理器架构。
struct data_struct
{
char a;
int b;
};
如果我们在i386上使用sizeof运算符得到结构的大小,它将变为8.但是sizeof(char)是1而sizeof(int)是4所以总共需要5个字节,但是编译器分配了8个字节。实际上它也为char成员分配了4个字节。
答案 1 :(得分:1)
编译器填充结构以进行对齐。这不可移植,因为它取决于机器的架构。
答案 2 :(得分:0)
它分配足够的空间来存储位字段声明中指定的类型,而不考虑位数。在您的情况下,无符号整数大小为4个字节。
答案 3 :(得分:0)
结构或联合的成员可以具有除可变修改类型之外的任何完整对象类型。此外,可以声明成员由指定数量的位组成(包括符号位,如果有的话)。这样的成员称为位字段,其宽度前面有冒号
实现可以分配足够大的任何可寻址存储单元来保存位字段。 如果剩余足够的空间,则紧跟在结构中另一个位字段之后的位字段将被打包到同一单元的相邻位中。如果剩余的空间不足,则是否将不适合的位域放入下一个单元或重叠相邻单元是实现定义的。单元内位域分配的顺序(高位到低位) - order或low-order to high-order)是实现定义的。可寻址存储单元的对齐未指定。
在结构对象中,非位字段成员和位字段所在的单位的地址按声明的顺序增加。指向适当转换的结构对象的指针指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然。在结构对象中可能有未命名的填充,但不是在它的开头。
- ISO / IEC 9899:201x 6.7.2.1
当sizeof应用于类型为char,unsigned的操作数时 char或signed char,(或其合格版本),结果为1。 当应用于具有数组类型的操作数时,结果为 数组中的总字节数.103)应用于操作数时 具有结构或联合类型,结果是总数 这样一个对象中的字节,包括内部和尾部填充
- ISO / IEC 9899:201x 6.5.3.4.4