本人愚昧,对于其他人说的规则表示不理解,可能是理解不到位,固自己测试了番。
//后面表示sizeof目前变量 的strucat大小;
struct s1{
chara; //1
shortb; //2+2
intc; //2+2+4
//8
intd; //4
chara1; //1
shorte; //2(1+1)+2
//16
charac; //1+7
//24
intai; //4(1+3)+4 没有最终填充
//24
characc; //1+7
//32
__int64f; //8
//40
};
struct s1{
__int64f; //8
//8
chara; //1
shortb; //2+2
intc; //2+2+4
//16
charcc; //1+7
//24
intccc; //1+3+4 cc要先与ccc对齐,所以cc先补充3
//24
shortss; //2 新的
//32
charc1; //2+1+5
//32
charc2,c3,c4; //2+1+3+2
//32
charc5,c6; //2+1+3+2(非填充)
//32
charc7; //1+7
//40
};
规律,以结构体中变量最大的对齐。在最终时补充。结果为8的倍数。
子补充,当前面是char,后面是int ,则char要对齐int 补充3字节。
又如:当前面char,后面是short,char 要对齐补充short补充1字节
后面没了就对齐(本例__int64 8字节)补充4;
若short后再来个char,后面没了,这char对齐最大的变量(本例__int64 8字节)
Char对齐8,根据前面的char,short已占4字节,后char 要补齐8只需填充3;