内存中的数据对齐

为何数据须要内存对齐?性能

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占用了

  能够看到,不一样的编译器的对齐方式是不一样的。

相关文章
相关标签/搜索