昨天和wub讨论,为什么struct对齐的时候,double类型的地址要以8对齐。
对齐的目的就是为了方便和加速处理器读取,那么只需要和字长对齐就可以了。
根据这两篇文章:
《内存对齐与ANSI C中struct型数据的内存布局》vs
《难以理解的《内存对齐与ANSI C中struct型数据的内存布局》》gcc和vc下是不同的。对于double类型,默认gcc的对齐模数是4,VC是8.
内存对齐是与处理器,编译器,编译选项相关的,因此单纯给出一个struct,问其sizeof是多少,这样的问法是不严谨的。回答该问题,应该加以说明运行环境。
vc的默认对齐模数是:sizeof(该类型)
gcc的默认对齐规则是:byte为1,char为2,其他均为4.
由上可知
struct s{
char c;
double d;
};
gcc下
sizeof(s) = 4+8 = 12
vc下
sizeof(s) = 8+8 = 16
那么 struct s{
double d;
char c;
};
起初我认为c以后不需要填充,因此gcc下sizeof(s)=8+1 = 9。但事实应该是sizeof(s)==8+4 = 12。
因为对于数组来说,要保证数组的大小等于数组的个数乘以元素的大小。因此c之后也是需要填充的,这样后续的元素的地址才会是字长的倍数。