内存中的数据对齐

为什么数据需要内存对齐?

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

  可以看到,不同的编译器的对齐方式是不同的。

posted on 2019-05-24 17:04  锋邢天下  阅读(621)  评论(0编辑  收藏  举报

导航