此文主要介绍的是关于结构体内存对齐相关知识,如果对此存在问题或者有兴趣的读者可以看看。
1 结构体介绍
结构体的声明
struct stu{
char name[20];
int age;
char sex[5];
};
上述代码,stu是结构体tag,花括号内部是成员变量,至少存在一个成员变量。花括号后的分号;不能省略。
1.1 代码分析1
struct S2
{
char c1;
int i;
char c2;
};
printf("%d\n", sizeof(struct S2));
输出结果:12
分析:c1占一个字节,但是i从第5个开始存储,c2从第9个开始存储。
1.2 图解1
1.3 代码分析2
struct S1
{
char c1;
char c2;
int i;
};
printf("%d\n", sizeof(struct S1));
输出结果:8
分析:c1,c2挨着存放,但i从第5个开始存储。
1.4 图解2
2 提升内容
- 结构体嵌套时,如何看内存对齐,计算内存大小。
- 修改默认对齐数#pragma pack(1)、#pragma pack();分别代表的是设置对齐数为1,取消对齐数,还原为默认。
- 位段:一种压缩存储方案,不考虑效率,只考虑空间使用率。其用法和内存对齐有点相对的意思。
3 总结
1 结构体第一个元素不需要对齐,直接存放,即偏移量为0的地址处。
2 其他成员变量要对齐到对齐数的整数倍的地址处。
3 结构体总大小为最大对齐数的整数倍,每个结构体元素都要参与运算
4 嵌套结构体,结构体的整体大小就是所有最大对齐数的整数倍。
内存对齐:以牺牲空间提高效率