關於記憶體對齊詳細解釋

2021-09-12 07:13:20 字數 863 閱讀 5035

什麼是記憶體對齊?

在用sizeof運算子求算某結構體所佔空間時,並不是簡單地將結構體中所有元素各自的空間相加,這裡涉及到記憶體對齊的問題。訪問未對齊的記憶體,處理器需要訪問兩次(資料先讀高位再讀低位然後進行拼接),而訪問對齊的記憶體,只需要一次。為了提高效率,所以進行記憶體對齊。windows的預設對齊數是8,linux中預設對齊數為4.

為什麼會產生記憶體對齊的原因?

1.平台原因:

某些平台只能在特定的位址處訪問特定型別的資料。

2.效能原因:

(1)資料結構(尤其是棧)應該盡可能在自然邊界上對齊。

(2)為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問;而未對齊的記憶體僅需要訪問一次。

編譯器是怎樣進行記憶體對齊的優化的?

在記憶體中,編譯器按照成員列表順序分別為每個結構體變數成員分配記憶體,在儲存過程中需要滿足邊界對齊要求時,編譯器會在成員之間留下額外的記憶體空間。

結構體或聯合體的資料成員、第乙個成員放到0編譯地方,以後每個資料成員放到自身對齊的整數倍偏移處。(結構體大小必須是最大對齊數的整數倍)。

位元組對齊可以程式控制,採用指令:

#pragma pack(1)//1位元組對齊

#pragma pack(2)//2位元組對齊

#pragma pack(4)//4位元組對齊

#pragma pack(8)//8位元組對齊

舉個栗子:

記憶體對齊詳細解釋

記憶體對齊詳細解釋 1 分析說明 輸出結果 sizeof structtest t 10 兩個編譯器輸出一致 分析過程 pragmapack 2 structtest t pragmapack 成員總大小 9總體對齊係數 min max int,short,char 2 2 總體大小 size 成員...

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

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

關於記憶體對齊

資料傳送到網路板的資料報大小根本不是實際控制數 據包的大小 這時我才想起乙個人,stanley b.lippman,他寫的那 一本書 inside object modale 曾經提過這樣的事 情,編譯器為了提高cpu的效率,會對struct 的結構進行優化,利用sizeof 可以得出不同的計算機上...