爲何數據須要內存對齊?性能
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佔用了
能夠看到,不一樣的編譯器的對齊方式是不一樣的。