目录
结构体内存对齐的概念
定义一个结构体变量
struct S
{
char c1;//1
int i;//4
char c2;//1
};
int main()
printf("%d\n", sizeof(struct S));
return 0;
}
请问sizeof(struct S)是多大呢?有小伙伴会说无非就是把内部成员各自的大小加起来:1+4+1=6,因此答案就是6,可惜答案不是这个,而是12。
为啥相差这么大呢?因为结构体内的成员之间在内存中的位置并不是紧挨在一起的。
即不是这样的:
而是这样的:
一个格子代表一个字节的大小,从图中也看不出12是哪里来的,大家细细的往下看
这些成员进行了内存对齐,即按照某种规则将这些成员在内存中的位置进行了调整,这种规则称之为结构体内存对齐。内存对齐后其外在表现就是struct S这个结构体类型的大小就会发生改变,也就是说结构体大小遵循结构体内存对齐规则
结构体内存对齐的规则
1.第一个成员在与结构体变量偏移量为0的地址处。
2.其他成员变量要对齐到自身对齐数的整数倍的地址处。
每个成员的对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的值为8(这个值可以进行修改)
linux没有默认值,直接以该成员大小为对齐数
3.结构体总大小为最大对齐数(从每个成员变量的对齐数中挑选)的整数倍。
4.