記憶體對齊原則

2021-07-09 10:52:23 字數 1344 閱讀 7092

一、記憶體對齊的原因

1、平台移植原因:不是所有的硬體平台都能任意訪問任意位址上的資料,有些硬體平台只能在某些特定位址處讀取特定的資料,否則會丟擲硬體異常;

2、效能原因:資料結構(尤其是棧)應盡可能的在自然邊界對齊。原因在於,訪問未對齊的記憶體,處理器需要進行兩次訪問,而訪問對齊的記憶體,處理器只需要進行一次訪問。

二、記憶體對齊的規則

在具體講記憶體對齊的規則之前引入乙個名詞:對齊係數,也叫對齊模數,每個編譯器都有自己預設的對齊係數,vc6.0預設為8。程式設計師可以根據需要進行修改,可通過預編譯指令#pragma pack(n),n就是對齊係數,可以取1、2、4、8、16,具體對齊規則有三條,如下:

(1).資料成員的對齊規則:結構體(struct)(或者聯合體(union))的資料成員,第乙個資料成員放在偏移量為0的地方,以後每個資料成員按照#pragma pack(n)和資料成員中比較小的那個數對齊,也就是說,起始位址需要時這個數的倍數,具體下面會舉例說明;

(2).結構體(struct)(或者聯合體(union))整體對齊規則:整體的大小應該按照#pragma pack(n)和結構中最長的資料結構中,最大的那個進行,也就是,需要時間這個數的倍數;

(3).如果#pragma pack(n)比結構中任何乙個資料成員型別都大,則對齊係數不起任何作用。下面舉例說明,環境:vs2013,32位作業系統

#include using namespace std;

struct s

;struct t

;int main()

**輸出結果為:

sizeof(s) is 12

sizeof(t) is 8   

編譯器預設對齊係數為8:

對於結構體s,成員a是char型資料,佔1位元組大小,b是int型資料,占用4個位元組,因為規則1,所以需要從記憶體偏移量為4的倍數的地方開始,因此需要a需要補上3位元組無用記憶體,此時a占用4位元組,下面是c,c是short型資料,占用2個位元組,此時偏移量4+4=8,是2的倍數,符合規則1,結構體此時總大小:4+4+2=10;又根據規則2,結構體成員變數型別,最長的為4,因此結構體整體大小應該為4的倍數,因此需要c多占用2個位元組,此時結構體大小為:4+4+4=12。

對於結構體t,c是short型資料,占用2個位元組大小,a是char型資料,占用1個位元組大小,起始偏移量3,是1的倍數,滿足,此時大小為:2+1=3,b為int型資料,占用4位元組,起始偏移量為3,顯然不滿足規則1,需要b補充1個位元組,此時起始偏移量為2+2=4,滿足規則1,此時結構體t的大小為:2+2+4=8;又根據規則2,結構體成員變數型別中最長的為4,結構體記憶體大小滿足,因此,最終大小為8。

記憶體對齊原則

首先由乙個程式引入話題 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...

記憶體對齊原則

includeusing namespace std struct a struct b int main cout 以上結構體變數數量型別相同。但是sizeof卻不同,sizeof a is 12 sizeof b is 8 那麼問題來了,為什麼兩個一樣的結構體,但是sizeof大小卻不同?答案就...

記憶體對齊原則

記憶體對齊的原因 1 平台原因 移植原因 不是所有的硬體平台都能訪問任意位址上的任意資料的,某些硬體平台只能在某些位址處取得某些特定型別的資料,否則丟擲硬體異常。2 效能原因 資料結構 尤其是棧 應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問,而對齊的記憶...