每个特定平台上的编译器都有自己的默认“对齐系数”。我们可以通过预编译命令#pragma pack(k),k=1,2,4,8,16来改变这个系数,其中k就是需要指定的“对齐系数”;也可以使用#pragma pack()取消自定义字节对齐方式。具体的对齐规则如下:
规则1:struct或者union的数据成员对齐规则:第一个数据成员放在offset为0的地方,对齐按照#pragma pack指定的数值和自身占用字节数中,二者比较小的那个进行对齐
规则2:struct或者union的整体对齐规则:在数据成员完成各自对齐以后,struct或者union本身也要进行对齐,对齐将按照#pragma pack指定的数值和struct或者union中最大数据成员长度中比较小的那个进行;
struct Foo{
char x1;
double x2;
short x3;
float x4;
char x5;
};
x1<8 , 对齐系数为:1,x1占用0,x,x,x,x,x,x,x;
x2=8 ,对齐系数为:8,x2占用8,9,10,11,12,13,14,15;
x3<8 ,对齐系数为:2,x3占用16,17,x,x;
x4<8 ,对齐系数为:4,x4占用20,21,22,23;
x5<8,对齐系数为:1,x5占用24;
共25个字节,再根据规则2; x2占用内存最大,为8bytes,8bytes(最大内存大小) =8byte(对齐系数),最小为8,所以整体按照8进行对齐;25%8!=0
所以占用32个字节
感谢作者文章:http://www.jellythink.com/archives/413