转自http://www.cnblogs.com/xieyajie/p/8094788.html
概括:
一. 基本原则
1. struct中成员变量的声明顺序,与成员变量对应的内存顺序是一致的;
2. struct本身的起始存储地址必须是成员变量中最长的数据类型的整倍数,注意是最长的数据类型,而不是最长的变量(对于数组只看类型不看元素个数)
3. 内存对齐与编译器设置有关。
二. 计算规则(以下的所有规则,必须同时满足,并不是满足其中一条即可)
1. 每个成员变量相对于struct起始地址的偏移量,必须是成员变量自身类型长度的最小整倍数
2. 结构体内存大小,必须是成员变量中类型长度最长者的整倍数,如果不是,则在最后一个成员变量后补齐
3. 成员变量是数组时,按照类型长度对齐,而不是数组长度对齐(如int a[10]的类型长度为int型,即为4)
4. 成员变量是结构体时,根据struct基本原则,其存储偏移量必须是成员变量中最长的数据类型的整倍数(当进行规则2的判断时,结构体变量也是使用成员变量中最长类型,结合上边几条规则,这个其实很好理解的)