1.引入
1.1如下面的代碼,定義了三個變量,int,char,int,並輸出他們的十六進制的內存地址。
#include<stdio.h> int main() { int a; char b; int c; printf("a:%x b:%x c:%x\n",&a,&b,&c); //輸出: a:22ff1c b:22ff1b c:22ff14 return 1; }
1.2圖示分析上述代碼
代碼中為定義的變量a,b,c分配了內存單元,分配內存單元是從大地址開始分配的,可見a的內存地址大於b的地址。(除非分配的內存單元循環了。從0跳大了最大,又開始新的一輪減小)
int占用4個字節,char占用1個字節。
從代碼中可以看出為三個連續定義的變量的內存分配是不連續的。這就是因為地址對齊的原因。
2.地址對齊概念
地址對齊其實就是CPU設計中的一個時空權衡,這里采用的是空間換時間的。主要的解決問題是如何能過快速的讀取給定的一個變量。
目前的主流計算機有32位,64位這是地址線,一般數據線與地址線條數相同。
如果放置數據時不考慮地址對齊,32位的CPU讀取一個4字節的int最少需要一次內存訪問,最多需要2次訪問內存。下圖中左面,取一個int要兩次內存訪問,而右邊的只需要一次內存訪問。
上面的左圖為什么是2次訪問內存呢?這個需要用組成原理說明。
3.計算機組成原理解釋地址對齊
這里使用32位說明。16位的80x86,和目前流行的64位也是一樣的。
32位字長的機器,能一次訪問的數據是32bits。
如下圖所示:32條數據線,分成了4組,這樣就可以使用字節編碼,最小的訪問內存單元為一個字節。
同樣給出一個32位地址最多可以訪問32位的數據。
若一個int數據保存在32位機器中如2中的左圖所示,一次只能訪問到2字節數據,所以需要2次內存訪問;若一個int數據保存在32位機器中如2中的右圖所示,給出一次地址就能夠訪問整個int數據。
4總結
許多RAM都采用地址對齊,加速CPU。
采用地址對齊保存數據對應的地址如下: