补充:可以使用简单地从大到小排列成员,以取得最小地空间浪费(最大成员在先)。
——————————————————————
原则:
1,结构体中的第一个变量的起始地址为0,其余变量的内存其实位置为Min(#pragma pack(n),sizeof(这个变量))的整数倍。
2,如果有嵌套结构体,那么只需要将嵌套的结构体当作是普通变量即可。
3,最终sizeof 结构体的结果是所有对齐变量Min(#pragma pack(n),sizeof(这个变量))的整数倍。
注:VS编译器默认对齐(#pragma pack(n))的数值是8 linux下默认是4
例子:
//sizeof(s1)都是 16
struct s1
{
char a;
double b;
};
分析:
代码
struct s2//sizeof(s2) 是 16
{
char a;
int b;
double c;
};
分析:
代码:
struct s3//sizeof(s3) 是 24
{
char a;
double b;
int c;
};
分析:C变量后面额外的四字节内存是为了符合最终结构体长度必须是 (在本例中前提下)
8-->(b的对齐值)和4-->(c的对齐值)的整数倍。
代码:
struct s4 //sizeof s4 是 32
{
char a;
struct s2 s;
/*{
char a;
int b;
double c;
}*/
int b;
};
分析:首先分析内嵌结构体s2:
那么此时分析结构体s4: