内存中的数据对齐
为什么数据需要内存对齐?
1 平台原因
不是所有的硬件平台都能访问任意内存地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,
否则抛出硬件异常。为了同一个程序可以在多平台运行,需要内存对齐。
2 硬件原因
经过内存对齐后,CPU访问内存的速度大大提升。
为什么经过内存对齐后,CPU访问内存的速度大大提升?
CPU读取内存不是一次读取单个字节,CPU把内存当作一块一块的,块的大小可以是2,4,8,16个字节。
因此CPU在读取内存时是一块一块进行读取的。
假设CPU把内存划分为4字节大小的块,要读取一个4字节大小的int型数据,分二种情况:
1 该int数据从地址0开始
此时,直接将地址0,1,2,3处的四个字节数据读取到即可
2 该int数据从地址1开始
①CPU读取0,1,2,3处的四个字节数据
②CPU读取4,5,6,7处的四个字节数据
③合并地址1,2,3,4处的四个字节数据为一个int数据
看到该int数据如果没有从地址1开始的话会大大降低CPU的性能。
不同的编译器的对齐方式:
用如下代码分别在VC,和DEV C++编译器上执行。
#include<stdio.h>
int main()
{
int a;
char b;
int c;
printf("0x%08X ", &a);
printf("0x%08X ", &b);
printf("0x%08X ", &c);
return 0;
}
VC执行结果:
看到a占用 ff7c开始的4字节,b占用ff7b一个字节,c占用ff80开始的4字节
DEV C++执行结果:
a占用ff7c开始的4字节,c占用ff74开始的4字节,ff78开始的到ff7b的4字节被b占用了
可以看到,不同的编译器的对齐方式是不同的。