內存中的數據對齊

爲何數據須要內存對齊?性能

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

  能夠看到,不一樣的編譯器的對齊方式是不一樣的。

相關文章
相關標籤/搜索