内存对齐原则:
1.数据成员对齐规则:struct, union的数据成员,第一个数据成员放在offset为0的地方,之后的数据成员的存储起始位置都是放在该数据成员大小的整数倍位置。如在32bit的机器上,int的大小为4,因此int存储的位置都是4的整数倍的位置开始存储。
2.结构体作为数据成员的对齐规则:在一个struct中包含另一个struct,内部struct应该以它的最大数据成员大小的整数倍开始存储。如 struct A 中包含 struct B, struct B 中包含数据成员 char, int, double,则 struct B 应该以sizeof(double)=8的整数倍为起始地址。
3.收尾工作的对齐规则:整个struct的大小,应该为最大数据成员大小的整数倍。
例子:
struct uu { char f; int t; char c[2]; };
结果 sizeof(uu) : 12
按照上面的原则:
f是1对齐,0%1=0。
t是4对齐,1%4,需要补3个才能整除。
c与f一样,8%1=0。
最后,最大对齐是4,10%4补2整除。
因此,sizeof 为 12。
struct dd { double s; jj j; float u; };
结果 sizeof(dd) : 24
按照上面原则:
s是8对齐,0%8=0。
j最大元素是int,因此是4对齐,8%4=0。
u是4对齐,20%4=0。
最后,最大对齐是8,24%8=0。
因此,sizeof为 24。
利用这些原则,可以优化结构大小与访问速度
例如:
struct uu { int t; char f; char c[2]; };
结果 sizeof(uu):8