一、C语言结构体对齐步骤:
1.每个成员对齐
2.总体对齐
二、C语言结构体对齐规则:
1.结构体第一个成员存放在相较于结构体变量起始位置的偏移量为0的位置
2.从第二个成员开始,往后的每一个成员都要对齐到某个对齐数的整数倍处。
对齐数:结构体成员自身的大小和默认对齐数的较小值
VS上默认对齐数是8
gcc 没有默认对齐数,对齐数就是他本身大小
3.结构体的总大小,必须是最大对齐数的整数倍
最大对齐数是:所有成员的对齐数中最大的值
4.如果嵌套了结构体,嵌套的结构体对齐原则:他内部最大的成员的整数倍。结构体提总体大小就是所有最大对齐数(含嵌套结构体成员中最大的成员)的整数倍。
三、讲解:
#include<stdio.h>
struct s1
{ //自身大小 默认对齐数 最终对齐数
double d; // 第一个成员没有对齐数
char c; // 1 8 1
int i; // 4 8 4
};
struct s2
{ //自身大小 默认对齐数 最终对齐数
char c1; // 第一个成员没有对齐数
struct s1 s1; //嵌套结构体的成员最大为8 ,对齐数就是8 ,自身大小为16
char c2; // 1 8 1
};
int main()
{
struct s2 s;
printf("%d",sizeof(s));
return 0;
}
初步来看s变量的大小为 1+7+16+1=25
最终s变量的大小还要是:最大对齐数的整数倍,
而s的成员的最大对齐数是 8,所以应该是8的倍数,
所以最终s的大小是32