1.1字节对齐的概念
计算机中内存大小的基本单位是字节(byte),理论上,可以从任意地址访问某种基本数据类型,但实际上,计算机并非是逐字节读写内存,而是以2、4、8的倍数的字节块来读写内存,如此一来就会对基本数据类型的合法地址作出一些限制,即它的地址必须是2、4、8的倍数。那么就要求各种数据类型按照一定规则在空间上排列,这就是对齐。
1.2字节对齐的原因
由于各个硬件平台对存储空间的处理上有很大的不同,一些平台对某些特定类型的数据只能从某些特定的地址开始储存。最常见的问题就是,如果不按照适合其平台的要求对数据存放进行对齐,会在存取效率上带来损失。
而我们在实际开发中,倒也无需忧虑这方面的问题,因为相应的语言编译器会替我们选择适合目标平台的对齐策略。(这里需注意:在开发环境 和 正式环境下运行的服务项目,编译打包时,建议使用相同平台进行,避免项目的跨平台编译运行。)
下面我们从实际的例子中去回忆字节对齐:
#include<stdio.h>
#include<stdint.h>
struct test
{
int a;
char b;
int c;
short d;
};
int main()
{
printf("the size of struct test is %zu \n", sizeof(struct test));
}
// the size of struct test is 16
从编译运行的结果来开,test的大小为16字节(说明四个类型发生了以4个字节自然对齐的结果),而不是四个类型紧密排列的11字节(int a:4字节、char b:1字节、 int c:4字节、short d:2字节)