1.什麼叫地址對齊?架構
RISC 下使用訪存指令讀取或寫入數據單元時,目標地址必須是所訪問之數據單元字節數的整數倍,這個叫作地址對齊。性能
2.計算機主要的架構分哪兩類?及其地址對齊在二者的區別?
網站
計算機主要的架構就分爲兩類,複雜指令集計算機(CISC)和精簡指令集計算機(RISC)。CISC最有表明性的架構就是x86,RISC最有表明性的架構就是ARM。無論是什麼架構,對要訪問的必定長度的數據的地址是有要求的,好比要訪問一個32位的整數,那麼這個數據必須(最好)存儲在以4字節(32/8=4)對齊的地方。通常來講,RISC對對齊要求的更嚴格些,非對齊訪問可能會帶來性能上的損失。這對程序在不一樣架構間移植很是重要,由於它極有可能致使你的程序崩潰。spa
從理論上講彷佛對任何類型的變量的訪問能夠從任何地址開始,但實際狀況是在訪問特定類型變量的時候常常在特定的內存地址訪問,各個硬件平臺對存儲空間的處理上有很大的不一樣。一些平臺對某些特定類型的數據只能從某些特定地址開始存取。.net
3.MIPS平臺的地址對齊。code
在 MIPS 平臺上,lh 讀取一個半字時,存儲器的地址必須是 2 的整數倍; lw 讀取一個字時,存儲器的地址必須是 4的整數倍; sd 寫入一個雙字時,存儲器的地址必須是 8 的整數倍。假若訪存時,目標地址不對齊,則會引發異常,典型的是系統提示「總線錯誤」後,直接殺死進程。blog
直接貼代碼:進程
1 int main(void){ 2 unsigned int i = 0x12345678; 3 4 unsigned char *p = (unsigned char *)&i; 5 *p = 0x00; 6 unsigned short *p1 = (unsigned short *)(p+1); 7 *p1 = 0x0000; 8 9 return 0; 10 }
最後兩句代碼,從奇數邊界去訪問unsigned short型變量,顯然不符合對齊的規定。在X86上,相似的操做只會影響效率;但在MIPS或者SPARC上可能致使error,由於它們要求必須字節對齊。