1. 程式人生 > >關於C語言記憶體對齊,提高定址效率問題

關於C語言記憶體對齊,提高定址效率問題

前言:

計算機的記憶體都是以位元組為單位來劃分的,CPU一般都是通過地址匯流排來訪問記憶體的,一次能處理幾個位元組,就命令地址匯流排去訪問幾個位元組,32位的CPU一次能處理4個位元組,就命令地址匯流排一次讀取4個位元組,讀少了浪費主頻,讀多了也處理不了。64位的CPU一般讀取8個位元組。

運用:

對於程式來說,一個變數最好位於一個定址步長的範圍內,這樣一次就可以讀取到變數的值;如果跨步長儲存,就需要讀取兩次,然後再拼接資料,效率顯然降低了。例如一個 int 型別的資料,如果地址為 8,那麼很好辦,對編號為 8 的記憶體定址一次就可以。如果編號為 10,就比較麻煩,CPU需要先對編號為 8 的記憶體定址,讀取4個位元組,得到該資料的前半部分,然後再對編號為 12 的記憶體定址,讀取4個位元組,得到該資料的後半部分,再將這兩部分拼接起來,才能取得資料的值。將一個數據儘量放在一個步長之內,避免跨步長儲存,這稱為記憶體對齊。在32位編譯模式下,預設以4位元組對齊;在64位編譯模式下,預設以8位元組對齊。

結論:

記憶體對齊不是C語言的特性,它屬於計算機的執行原理,C++、Java、Python等其他程式語言同樣也會有記憶體對齊的問題。