記憶體對齊的原因調查

2021-06-20 21:57:11 字數 827 閱讀 3204

在讀《c專家程式設計》的3.2.1關於結構:

struct pid_tag

很有意思,嚴格遵守了字對齊,字對齊的原因、用法在課堂也曾提到過,

用法為:

#pragma pack(n) /* n = 1, 2, 4, 8, 16 */

當記憶體存放沒有對齊的時候會影響機器效能,一直都記著這句話,卻知其然不知其所以然,今天偶然翻看《計算機組成與設計硬體/軟體介面》(強烈推薦,沒有系統學過計算機課程,這本書作為計算機組成原理看最好了)才算是對其中原理有了點了解,記錄下來,防備以後忘了。

對齊的作用和原因:各個硬體平台對儲存空間的處理上有很大的不同。一些平台對某些特定型別的資料只能從某些特定位址開始訪問。比如有些架構的cpu在訪問 乙個沒有進行對齊的變數的時候會發生錯誤,那麼在這種架構下程式設計必須保證位元組對齊.其他平台可能沒有這種情況,但是最常見的是如果不按照適合其平台要求對 資料存放進行對齊,會在訪問效率上帶來損失。比如有些平台每次讀都是從偶位址開始,如果乙個int型(假設為32位系統)如果存放在偶位址開始的地方,那 麼乙個讀週期就可以讀出這32bit,而如果存放在奇位址開始的地方,就需要2個讀週期,並對兩次讀出的結果的高低位元組進行拼湊才能得到該32bit數 據。顯然在讀取效率上下降很多。

更為嚴重的是,所影響到的並不僅僅是乙個讀週期,mips對記憶體的操作僅出現在訪問操作中,這一限制意味著可以在指令執行級計算記憶體位址,在下乙個步驟訪問記憶體。在流水線操作中,記憶體沒有對齊,將出現一條資料傳輸指令需要兩次記憶體訪問的情況,所請求的資料不能在單個流水線步驟內完成在處理器和記憶體之間的傳輸。這時候流水線將發生資料冒險:乙個操作必須等待另乙個操作完成後才能進行,流水線必須停頓!這才是造成效能下降的主要因素。

記憶體對齊的原因

1.平台原因 移植原因 不是所有的硬體平台都能訪問任意位址上的任意資料的,某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。2.效能原因 資料結構應該盡可能邊界對齊。原因在於,為了訪問未對齊的記憶體,處理器需要兩次記憶體訪問,而對齊的記憶體訪問僅需要一次訪問。比如char a in...

記憶體對齊 記憶體對齊規則解釋 記憶體對齊原理

一 記憶體對齊的原因 我們都知道計算機是以位元組 byte 為單位劃分的,理論上來說cpu是可以訪問任一編號的位元組資料的,我們又知道cpu的定址其實是通過位址匯流排來訪問記憶體的,cpu又分為32位和64位,在32位的cpu一次可以處理4個位元組 byte 的資料,那麼cpu實際定址的步長就是4個...

記憶體對齊(自然對齊)

參考 今天與超,暉,棟,宇幾人論此問題,終得以下結論,不知正確與否,姑且記下。對於32位機,cpu的記憶體讀寫週期是4word,所以在記憶體對齊時,皆以此填滿。如 struct a char a double b char c sizeof a 4 8 4 16 struct b char a do...