什麼是記憶體對齊
一個很簡單的問題,我們都知道,在32位作業系統中,int是4個bytes,char是1個bytes,那麼一個結構體中,如果有1個int,又有一個char,這個結構體佔用的記憶體是否為5個bytes呢?我們透過一段程式碼測試一下。
//32位系統 #include<stdio.h> struct{ int x; char y; int z;}s;int main(){ printf("%d\n",sizeof(s); return0;}
當我們執行這個程式,發現輸出的結果並不是9,而是12,這就是記憶體對齊。作業系統在編譯的過程中,會以結構體中成員的最大值作為其對齊的值。在上述例子中,雖然char只佔一個bytes,但是接下來的z需要從對齊值的倍數開始申請,也就是作業系統會跳過5,6,7(base0),從8開始為z申請記憶體。
為什麼需要記憶體對齊?這是因為作業系統在資料讀取的時候,其實並不是一個位元組一個位元組進行讀取的,而是一段一段進行讀取,我們假如是4bytes。假如我們要讀取一個int,這個int是從第1位到第4位。那麼讀取的時候會發生什麼事情呢?首先我們需要先讀第一塊資料,然後讀取後三位的資料。接下來,讀取第二塊資料,然後只取第一位的資料。最後將兩次的資料組合起來,就是我們想要的一個數據。
對於作業系統來說,這種處理資料的方式並不是特別地高效。我們都知道,在計算機領域,有一個特別有名的最佳化手段,就是空間換時間。我們透過記憶體對齊,直接跳過部分空的位元組,然後一次性讀取所需資料。
記憶體對齊的規則記憶體對齊的規則如下,基本型別的對齊值,其實就是他們的sizeof值。而結構體的對齊值,就是結構體中最大的對齊值。
那麼,知道記憶體對齊了之後,有什麼作用呢?假如我們的一個結構體有1個int,兩個char, 那麼不同的排列順序,會造成結構體的大小不一致。
我們注意到,不同的排列順序最終會讓結構體佔用不同的記憶體。雖然這些只是非常小的細節,但是在開發過程中,假如我們能夠注意到這些細節,必將事半功倍。
最新評論