一、结构体的基础定义
在 C 语言中,struct 是一种非常强大的自定义数据类型,它能将不同类型的数据打包到一个整体中。
结构体(struct)可以将多个不同类型的变量组合在一起,例如:
struct Student
{
int id;
char name[20];
float score;
};
二、结构体的内存布局
现代计算机对某些类型的数据要求按特定地址访问(对齐),否则访问效率低,甚至出错。因此编译器会:
-
按照每个成员的数据类型要求对齐
-
在必要时插入 填充字节(padding)
-
整个结构体的大小也会被 对齐到最大成员的对齐数的整数倍
三、示例分析
64位系统(x86_64)默认对齐数(结构体)为8
变量的偏移量为变量占据字节大小和默认对齐数的最大公约数
结构体占据的内存空间为所有变量占据字节大小和默认对齐数的最大公约数
在这个例子中,char的最大公约数为1
int的最大公约数为4
所以在这个结构体中占据的总内存空间大小因为四的倍数
而且在int的内存分配开始的偏移量也要时四的倍数,而char只需要为1的倍数
struct Example
{
char a; // 1 字节
int b; // 4 字节
char c; // 1 字节
};

红色代表浪费的空间
创建第一个变量char时,从内存偏移量为1的位置开始分配空间,占据一个字节
创建第二个变量int时,从内存偏移量为4的倍数的位置开始分配空间,占据四个字节
创建第三个变量char时,从内存偏移量为9的位置开始分配空间,占据一个字节
869

被折叠的 条评论
为什么被折叠?



