结构体内存对齐原则
struct S1
{
char a;//1字节
char b;//4字节
char c;//1字节
};
struct S2
{
char a;//1字节
int b;//1字节
char c;//4字节
};
以编译器vs为例(vs默认对齐数为8)
对于S1而言
a从偏移量为0开始占一个字节
b大小为1,所以往下偏移量为1。
c大小为4,所以往下继续偏移4个单位。
这时候总的大小为6,最大对齐数为4,所以要浪费两个单位,所以sizeof(struct S1)为8
对于S2
a从偏移量为0开始,
b的对齐数为4,但是此时地址为1,所以不是4的整数倍,因此往下3个浪费3个字节,对齐到偏移量为8处。
c的对齐数为1,所以整体来说,S2占了9个单位,但是此时该结构体各个成员最大对齐数为4,根据结构体对齐原则,此时应该浪费3个单位凑成4的整数倍,所以sizeof(struct S2)为12。
若
struct S2
{
char a;
int b;
char c;
};
struct S3
{
char m;
struct S2 s2;
int n;
};
对于S2此处已经了解,但对于S3嵌套了一个结构体S2
m,依旧从偏移量为0开始。
对于结构体S2,由上面知道是12个大小,最大对齐数为4,所以为了使S2在地址为4的整数倍,因此要浪费三个空间,从偏移量为4的地方开始。往后数12个
同理,n的情况一样。此时,S3全部偏移量为20,为最大对齐数4的倍数。所以sizeof(struct S3)就是为20
而为什么出现内存对齐呢