通過編程察看處理機的記憶體管理原則
作者: 張桂權
記憶體是處理機可以直接存取(讀寫)的電腦存放裝置,它由一系列的儲存單元組成。而一個記憶體單元是一個基於晶體管的電子元件,它有兩種可以映射為“1”和“0”的狀態。處理機的記憶體管理原則有兩種:升序 和降序。
在升序管理機制中,記憶體是由下往上升序排列的。也就是說,低地址的記憶體在底部,而高地址的排列在頂部;而在降序管理機制中與此相反。這是兩種截然不同的策略,雖然都為了更好的儲存資料,和有效利用記憶體單元。
我們一般都不會關心這些機制的,應為這是由硬體供應商在處理機設計的時候決定的。我們只管用就行了。我們在寫程式時一般只考慮其中的邏輯機構,而不是武力機構,除非你寫的是嵌入式程式而且為了提高效率和記憶體的利用率不得不通過底層操作直接進行記憶體管理(這時候,記憶體顯得很重要不得隨便浪費)。
程式是由指令和資料群組成的。對於只有一位元組的資料我們可是用它的地址來指示該資料。但是對於多位元組資料就不能這樣冒昧的操作了。多位元組資料在記憶體中的存放方式有升序和降序兩種。如果多位元組資料中高位被放在低地址記憶體單元,而低位被放在高地址記憶體單元,那麼我們就說它採用的是降序記號,反之為升序記號。這也是有具體的處理機的記憶體管理機制決定的。我們沒有能力也沒有必要去改變這種機制,不過我們可以通過編程看看自己的處理機採用的是哪一種機制。
假設我們有一個多位元組值“0xABCDEF12“,那麼在升序排列機制下的次序為: ABCDEF12
否則,為12EFCDAB。
你可以通過下面的程式的輸出結果看看你的處理的管理機制了:
#include <stdio.h>
void main(int argc, char *argv[]) {
unsigned long test = 0xABCDEF12;
unsigned char *pointer;
pointer = (unsigned char *)&test;
printf("%X %X %X %X /n", *pointer,*(pointer+1),*(pointer+2),*(pointer+3) );
return;
}
如果採用的降序記號方式,那麼結果是: 12 EF CD AB