目录
1. 什么是结构体内存对齐
结构体不像数组,结构体中可以存放不同类型的数据,它的大小也不是简单的各个数据成员大小之和,限于读取内存的要求,而是每个成员在内存中的存储都要按照一定的偏移量来存储,根据类型的不同,每个成员都要按照一定的对齐数进行对齐存储,最后整个结构体大小也要按照一定的对齐数进行对齐。
2. 对齐规则
- 第一个成员在与结构体变量偏移量为0的地址处。
- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
- 对齐数=编译器默认的一个对齐数 与 该成员大小的较小值。
- linux中默认为4
- vs中的默认值为8
- 结构体总大小为最大对齐数的整数倍(每个成员变量除了第一个成员变量都有一个对齐数)
- 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
3. 案例
3.1 案例1
计算如下结构体大小。
#include<stdio.h>
struct people
{
char sex;
int number;
short name;
};
int main()
{
struct people one;
printf("struct people size: %ld\n", sizeof(one));
return 0;
}
运行结果:
char 类型占1个字节,编译器默认对齐数为8,则该变量对齐数为1
int 类型占4个字节,编译器默认对齐数为8,则该变量对齐数为4
short类型占2个字节,编译器默认对齐数为8,则该变量对齐数为2
结构体整体的对齐数为所有成员的对齐数最大的一个,对齐数为4
结构体整体大小,按照上面数据占据空间大小,计算得结构体大小 为10字节,按照对齐规则,应该对齐到4的倍数,实际大小为12.
3.2 案例2
第2个案例是修改了案例1的结构体成员的位置,将short类型和int 类型换了一下。
#include<stdio.h>
struct people
{
char sex;
short name;
int number;
};
int main()
{
struct people one;
printf("struct people size: %ld\n", sizeof(one));
return 0;
}
运行结果:
char 类型占1个字节,编译器默认对齐数为8,则该变量对齐数为1
short 类型占2个字节,编译器默认对齐数为8,则该变量对齐数为2
int类型占4个字节,编译器默认对齐数为8,则该变量对齐数为4
结构体整体的对齐数为所有成员的对齐数最大的一个,对齐数为4
结构体整体大小,按照上面数据占据空间大小,计算得结构体大小 为7字节,按照对齐规则,应该对齐到4的倍数,实际大小为8.