为何数据须要内存对齐?性能
1 平台缘由spa
不是全部的硬件平台都能访问任意内存地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,blog
不然抛出硬件异常。为了同一个程序能够在多平台运行,须要内存对齐。内存
2 硬件缘由编译器
通过内存对齐后,CPU访问内存的速度大大提高。io
为何通过内存对齐后,CPU访问内存的速度大大提高?编译
CPU读取内存不是一次读取单个字节,CPU把内存看成一块一块的,块的大小能够是2,4,8,16个字节。硬件
所以CPU在读取内存时是一块一块进行读取的。程序
假设CPU把内存划分为4字节大小的块,要读取一个4字节大小的int型数据,分二种状况:im
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占用了
能够看到,不一样的编译器的对齐方式是不一样的。