什麼是記憶體對齊以及作用

2021-09-20 21:13:35 字數 1348 閱讀 9139

為了解釋這個問題,先來介紹下面的例子:

#includeusing namespace std;

struct a

;struct b

;int main()

的倍數。

2、每個資料成員完成在結構體內部對齊的時候,還要進行整個結構體在記憶體中的對齊,整個結構體的大小為 min 的倍數。

#pragram pack(n) 表示的是設定n位元組對齊,在vc6中預設是8,所以,我們一般都不用考慮這個,除非我們自己自定義記憶體對齊。

通過以上的規則,來解釋一下之前的兩個例子:

struct a

;struct b

;

對於結構體 a

a的長度為1位元組,偏移量為0;b的長度為2,它的偏移量應該是2的倍數,之前加起來的資料大小總和為1位元組,所以a後面要有一位元組的空;c的長度為4位元組,偏移量應該是4的倍數,之前的資料大小總和為1+1+2=4位元組,剛好是4的倍數,在結構體內部的大小總和為8。再進行結構體的對齊,結構體資料長度最大是4,要是4的倍數,8剛好就是4的倍數,所以結果為8。

對於結構體b

b的長度為2位元組,偏移量為0;c的長度為4,它的偏移量應該是4的倍數,之前加起來的資料大小總和為2位元組,所以b後面要有2位元組的空位;a的長度為1位元組,偏移量應該是1的倍數,之前的資料大小總和為2+2+4=8位元組,是1的倍數,在結構體內部的大小總和為9。再進行結構體的對齊,結構體資料長度最大是4,要是4的倍數,但9不是4的倍數,所以結果為12。

一、硬體原因:加快cpu訪問的速度

我們大多數人在沒有搞清楚cpu是如何讀取資料的時候,基本都會認為cpu是一位元組一位元組讀取的,但實際上它是按照塊來讀取的,塊的大小可以為2,4,8,16。塊的大小也稱為記憶體讀取粒度。

假設cpu沒有記憶體對齊,要讀取乙個4位元組的資料到乙個暫存器中,(假設讀取粒度為4),則會出現兩種情況

1、資料的開始在cpu讀取的0位元組處,這剛cpu一次就你能夠讀取完畢

2、資料的開始沒在0位元組處,假設在1位元組處吧,cpu要先將0~3位元組讀取出來,在讀取4~7位元組的內容。然後將0~3位元組裡的0位元組丟棄,將4~7位元組裡的5,6,7位元組的資料丟棄。然後組合1,2,3,4的資料。

由此可以看出,cpu讀取的效率不是很高,可以說比較繁瑣。

但如果有記憶體對齊的話:

由於每乙個資料都是對齊好的,cpu可以一次就能夠將資料讀取完成,雖然會有一些記憶體碎片,但從整個記憶體的大小來說,都不算什麼,可以說是用空間換取時間的做法。

二、平台原因:

不是所有的硬體平台都可以訪問任意位址上的任意資料,某些硬體平台只能在某些位址處取某些型別的資料,否則丟擲硬體異常。

什麼是記憶體對齊?為什麼要記憶體對齊?

要了解為什麼要記憶體對齊,首先我們要了解什麼是記憶體對齊 typedef struct a typedef struct b 分別對他們求大小,sizeof a sizeof b 我們所得到的結果是不同的,sizeof a 24而sizeof b 16為什麼會產生不一樣的結果呢?這是非常簡單的乙個例...

什麼是對齊,以及為什麼要對齊

現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的作用和原因 各個硬體平台對儲存空間的處理上有...

記憶體對齊規則以及作用

首先由乙個程式引入話題 1 環境 vc6 windows sp22 程式13 include 45 using namespace std 6 7struct st1 8 13 14struct st2 15 20 21int main 22 27 程式的輸出結果為 sizeof st1 is 12...