#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
#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
编译器通常会在结构的两个成员之间分配一些空白空间,以加快访问每个成员的速度。这称为填充。对齐的大小主要取决于处理器架构。
struct data_struct
{
char a;
int b;
};
如果我们在 i386 上使用 sizeof 运算符获得结构的大小,它将为 8。但 sizeof(char) 为 1,sizeof(int) 为 4,因此总共需要 5 个字节,但编译器分配了 8 个字节。实际上它也为 char 成员分配了 4 个字节。
编译器填充结构以进行对齐。这不是可移植的,因为它取决于机器的架构。
它分配足够的空间来存储位域声明中指定的类型,而不考虑位数。在您的情况下,无符号整数大小为 4 个字节。
结构或联合的成员可以具有除可变修改类型之外的任何完整对象类型。此外,可以声明成员由指定数量的位组成(包括符号位,如果有的话)。这样的成员称为位域,其宽度前面有一个冒号
实现可以分配任何大到足以容纳位域的可寻址存储单元。如果有足够的空间剩余,紧跟在结构中另一个位域之后的位域将被打包到同一单元的相邻位中。如果剩余空间不足,则将不适合的位域放入下一个单元还是与相邻单元重叠是实现定义的。单元内位域的分配顺序(高位到低位或低位到高位)是实现定义的。未指定可寻址存储单元的对齐方式。
在结构对象中,非位域成员和位域所在的单元的地址按声明顺序递增。一个指向结构对象的指针,经过适当的转换,指向它的初始成员(或者如果该成员是位域,则指向它所在的单元),反之亦然。结构对象中可能有未命名的填充,但不是在其开头。
——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