C 記憶體對齊原則

2021-08-03 09:43:07 字數 2040 閱讀 7153

c++記憶體對齊原則

(1)在沒有#pragam pack巨集的情況下,struct/class/union記憶體對齊原則有四個:

資料成員對齊規則:結構(struct)或聯合(union)的資料成員,第乙個資料成員放在offset為0的位置,以後每個資料成員儲存的起始位置都是放在該資料成員大小的整數倍位置。如在32bit的機器上,int的大小為4,因此int的儲存位置都是從4的整數倍的位置開始儲存的。

結構體作為成員:如果乙個結構裡有某些結構體成員,則結構體成員要從其內部「最寬基本型別成員」的整數倍位址開始儲存(struct a裡面有struct b,b裡面有char、int、double等元素,那b應該從8的整數倍位置開始儲存)。

收尾工作:結果體的總大小,也就是sizeof的結果,必須是其內部最大成員的「最寬基本型別成員」的整數倍,不足時要補齊。(基本型別不包括struct、class、union)

sizeof(union),以結構裡面size最大元素為union的size,因為在某乙個時刻,union只有乙個成員真正儲存於該位址。

舉例說明一下:

class a

;class b

;cout上例輸出結果為8和16,原因是a的最大資料元素為int,大小為4,補齊之後為1+(3)+4 = 8;b的最大資料元素為double,大小為8,補齊之後為1+(7)+8=16.

class c

;class d

;cout上例輸出結果為12和8。原因是資料放入記憶體的時候,是按記憶體塊存放的,所以c的大小為1+(3)+4+1+(3)=12,而d的大小為1+1+(2)+4 = 8.

class a

;class b

;cout上例中輸出結果為28.原因是當乙個乙個的存入記憶體塊時,當存到第5個記憶體塊時,a哭裡只剩下1個char,下乙個時int,大小為4,放不下,需要補齊,因此21+(3)+4 = 28.

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

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

2、  效能原因:經過記憶體對齊後,cpu的記憶體訪問速度大大提公升。具體原因稍後解釋。

圖一:這是普通程式設計師心目中的記憶體印象,由乙個個的位元組組成,而cpu並不是這麼看待的。

圖二:cpu把記憶體當成是一塊一塊的,塊的大小可以是2,4,8,16位元組大小,因此cpu在讀取記憶體時是一塊一塊進行讀取的。塊大小成為memory access granularity(粒度) 本人把它翻譯為「記憶體讀取粒度」 。

假設cpu要讀取乙個int型4位元組大小的資料到暫存器中,分兩種情況討論:

1、資料從0位元組開始

2、資料從1位元組開始

再次假設記憶體讀取粒度為4。

圖三:當該資料是從0位元組開始時,很cpu只需讀取記憶體一次即可把這4位元組的資料完全讀取到暫存器中。

當該資料是從1位元組開始時,問題變的有些複雜,此時該int型資料不是位於記憶體讀取邊界上,這就是一類記憶體未對齊的資料。

圖四:此時cpu先訪問一次記憶體,讀取0—3位元組的資料進暫存器,並再次讀取4—5位元組的資料進暫存器,接著把0位元組和6,7,8位元組的資料剔除,最後合併1,2,3,4位元組的資料進暫存器。對乙個記憶體未對齊的資料進行了這麼多額外的操作,大大降低了cpu效能。

這還屬於樂觀情況了,上文提到記憶體對齊的作用之一為平台的移植原因,因為以上操作只有有部分cpu肯幹,其他一部分cpu遇到未對齊邊界就直接罷工了。

(3)在使用#pragam pack(n)的情況下:

#pragam pack(1)

class a

;cout上例輸出結果為13,即1+4+8=13.

看懂#pragam pack(1)的作用了嗎?告訴編譯器按照1來進行記憶體對齊,即沒有記憶體對齊!

很明顯#pragma pack(n)作為乙個預編譯指令用來設定多少個位元組對齊的。值得注意的是,n的預設數值是按照編譯器自身設定,一般為8,合法的數值分別是1、2、4、8、16。

即編譯器只會按照1、2、4、8、16的方式分割記憶體。若n為其他值,是無效的。

c 記憶體對齊原則

struct class union記憶體對齊原則有四個 1 資料成員對齊規則 結構 struct 或聯合 union 的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小或者成員的子成員大小 只要該成員有子成員,比如說是陣列,結構體等 的整數倍開始 比...

記憶體對齊原則

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

記憶體對齊原則

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