記憶體對齊含義

2021-08-20 05:36:57 字數 963 閱讀 4005

對於記憶體對齊問題,主要存在於struct和union等復合結構在記憶體中的分布情況,許多實際的計算機系統對基本型別資料在記憶體中存放的位置有限制,它們要求這些資料的首位址的值是某個數m(通常是4或8);對於記憶體對齊,主要是為了提高程式的效能,資料結構,特別是棧,應盡可能在自然邊界上對齊,經過對齊後,cpu的記憶體訪問速度大大提公升。

windows中預設對齊數為8,linux中預設對齊數為4。

(1)記憶體對齊的主要作用:

1、平台原因(移植原因)

(1)不是所有的硬體平台都能訪問任意位址上的任意資料的;

(2)某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。

2、效能原因:

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

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

(2)記憶體對齊規則:

在記憶體中,編譯器按照成員列表順序分別為每個結構體變數成員分配記憶體,當儲存過程中需要滿足邊界對齊的 要求時,編譯器會在成員之間留下額外的記憶體空間。如果想確認結構體占多少儲存空間,則使用關鍵字sizeof,如果想得知結構體的某個特定成員在結構體的位置,則使用offsetof巨集(定義於stddef.h)。

1、資料成員對齊規則:結構(struct)(或聯合(union))的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員的對齊按照#pragma pack指定的數值和這個資料成員自身長度中,比較小的那個進行。

2、結構(或聯合)的整體對齊規則:在資料成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大資料成員長度中,比較小的那個進行。

3、結合1、2可推斷:當#pragma pack的n值等於或超過所有資料成員長度的時候,這個n值的大小將不產生任何效果。

這篇文章裡存在對應的例項,有興趣和便於理解的情況下,可以參閱一下。

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

一 記憶體對齊的原因 我們都知道計算機是以位元組 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...

位元組對齊 記憶體對齊 對齊粒度

其實標題裡面的三個關鍵字說的都是同乙個東西。也就是c 中類和結構體在記憶體中的分配策略,專業術語可以稱之為 對齊模數 alignment modules 對齊模數分為三類 1.自身對齊模數,也就是類或結構體中成員的大小,1,2,4,8之中的乙個,對應byte word dword qword。2.指...