一、什么是数据对齐
在当今计算机中,内存空间的划分都是按字节进行的。理论上,任何的数据类型的变量的访问可以从任意的地址开始,然而实际上在访问特定类型的变量时经常在特定的地址空间进行。各类型的数据在内存空间上按一定的规则进行排列而不是一个紧接一个排列,这就是所谓的数据对齐。
二、访问数据地址
访问数据的地址应满足一定的条件:能被该数据的长度所整除。
例如:2字节的数据的地址应满足被2整除;4字节的数据的地址应满足被4整除。
三、对齐的目的
(1)平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取得某些特定类型的数据,否则抛出硬件异常。比如有些平台每次读都是从偶地址开始,如果一个int型存放在偶地址开始位置,则一个读周期就可以读取该数据;如果存放在奇地址开始的位置则需要两个读周期才能读完该数据。
(2)性能原因:经过内存对齐后,CPU的内存访速度大大提升。
数据对齐占用内存举例
①
#include<stdio.h>
struct temp1
{
char c1;
char c2;
int a;
float b;
};
上面的例子中,c1占1个字节,c2也占1个字节,int型占2个字节,在存储c1、c2后开始的地址正好使a对齐。float占4个字节,存储完a后开始的地址也正好使b对齐。故sizeof(temp1) = 1+1+2+4 = 8个字节
②
#include<stdio.h>
struct temp2
{
char c1;
int a;
char c2;
float b;
};
上面的例子,c1占1个字节,int型占两个字节,为了使后面的int型数据对齐,需要增加1个字节,float型占4个字节,为了使其自然对齐,c2后应增加个3字节,故sizeof(temp2) = 1+1+2+1+3+4 = 12个字节