大小计算是按照下两个原则算出的
1,结构体内成员按自身按自身长度自对齐
自身长度,如char=1,short=2,int=4,double=8,。所谓自对齐,指的是该成员的起始位置的内存地址必须是它自身长度的整数倍。如int只能以0,4,8这类的地址开始。
当成员是有结构体时,(这个结构体成员自身对齐的起始位置为其子成员中最长的长度的整数倍。)
typedef struct dd
{
char a;
int b;
short c;
}DD;
struct ee
{
char a;
int b;
char c;
int d;
char f;
dd e;
}EE;
sizeof(dd) = 1+(3) +4+2 +(2) =12;
sizeof(ee) = 1+(3) +4+1 +(3) +4+1 +(3) +12 = 32;
2.结构体的总大小为结构体的有效对齐值的整数倍
结构体的有效对齐值的确定:
1)当未明确指定时,以结构体中最长的成员的长度为其有效值(如果成员中有结构体时,则该成员不作为最长长度,也即是;结构体不作为有效对齐值)。
2)当用#pragma pack(n)指定时,以n和结构体中最长的成员的长度中较小者为其值。
3)当用__attribute__ ((__packed__))指定长度时,强制按照此值为结构体的有效对齐值
typedef struct dd
{
char a;
int e;
short c;
short d;
char f;
}DD;
typedef struct ee
{
char a;
int b;
char c;
int d;
char f;
int g;
char h;//25
dd e;
}EE;
sizeof(dd) = 16;
sizeof(ee) = 25+(3)+ 16=44;
typedef struct dd
{
char a;
short c;
short d;
}DD;
typedef struct ee
{
char a;
int b;
char c;
int d;
char f;
int g;
char h;//25
dd e;//
}EE;
sizeof(dd) = 6;
sizeof(ee) = 25+(1) +6=32 //25+(1)刚好是结构体dd中sizeof(short)的整数倍,此值作为成员dd在ee结构体中的自对齐位置,然后加上dd结构体的长度,最后看相加后的此值是否是有效对齐值的整数倍。