关于字节对齐不再详细介绍,但是最近在linux下开发,发现linux下与windows下编译出现的结果却不一样。
struct tmp{
char a;
double b;
};
此结构体在windows下sizeof(tmp)的结果是:16
但是在Linux下的结果却是:12
并未手动设置字节对齐,在查阅了一些资料后发现有如下区别:
Win32平台下的微软VC编译器在默认情况下采用如下的对齐规则:
任何基本数据类型T的对齐模数就是T的大小,即sizeof(T)。比如对于double类型(8字节),就要求该类型数据的地址总是8的倍数,而char类型数据(1字节)则可以从任何一个地址开始。
Linux下的GCC奉行的是另外一套规则:
任何小于等于2字节的数据类型(比如short)的对齐模数是2,而其它所有超过2字节的数据类型(比如long,double)都以4为对齐模数。
如此这样的话,在Linux下double是按照4字节对齐,所以这个结构体char占一个字节,但是double占8个,按照4字节对齐,char需要填补3个空位0-3,所以double就是4-11总共12个字节。