C C 記憶體對齊原則及作用

2021-09-26 03:22:24 字數 2219 閱讀 2477

1).資料成員對齊規則:結構(struct)(或聯合(union))的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小或者成員的子成員大小(只要該成員有子成員,比如說是陣列,結構體等)的整數倍開始(比如int在32位機為4位元組, 則要從4的整數倍位址開始儲存),基本型別不包括struct/class/uinon。

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

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

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

no.1

class data; 

cout << sizeof(data) << endl;

no.2

class data; 

cout << sizeof(data) << endl;

no.3

class data; 

cout << sizeof(data) << endl;

no.4

class data; 

cout << sizeof(data) << endl;

no.3執行結果為 12 no.4執行結果為 8

class中的資料成員放入記憶體的時候,記憶體拿出乙個記憶體塊來,資料成員們排隊乙個乙個往裡放,遇到太大的,不是把自己劈成兩半,能放多少放多少,而是等下乙個記憶體塊過來。這樣的話,就可以理解為什麼no.3,no.4兩端的**輸出結果不一樣了,因為左邊是1+(3)+4+1+(3)=12,而右邊是1+1+(2)+4=8。括號中為補齊的bytes。

no.5

class bigdata; 

class data;

cout << sizeof(bigdata) << " " << sizeof(data) << endl;

no.6

class bigdata; 

class data;

cout << sizeof(bigdata) << " " << sizeof(data) << endl;

no.5和no.6執行結果均為: 48

在預設條件下,記憶體對齊是以class中最大的那個基本型別為基準的,如果class中有自定義型別,則遞迴的取其中最大的基本型別來參與比較。在no.5和no.6中記憶體塊乙個接乙個的過來接走資料成員,一直到第5塊的時候,bigdata裡只剩1個char了,將它放入記憶體塊中,記憶體塊還剩7個bytes,接下來是個int(4bytes),能夠放下,所以也進入第5個記憶體塊,這時候記憶體塊還剩3bytes,而接下來是個double(8bytes),放不下,所以要等下乙個記憶體快到來。因此,no.5的data的size=33+4+(3)+8=48,同理no.6應該是33+(7)+8=48。

順便提一下union: 共用體表示幾個變數共用乙個記憶體位置,在不同的時間儲存不同的資料型別和不同長度的變數。在union中,所有的共用體成員共用乙個空間,並且同一時間只能儲存其中乙個成員變數的值。

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

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

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

2、效能原因:

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

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

cpu執行指令時從記憶體中獲取資料是按cache line操作的,一般為64位元組。

假設cache line為4位元組,上圖中如果cpu讀取4-bytes或以上大小的資料的起始位址為1,則需要至少讀取2個資料塊,然後把2個塊中不需要的資料拋棄,再將有用資料拼接成4-bytes的資料,這明顯增加了cpu的操作,影響了cpu指令的執行效率。如果cpu讀取資料的起始位址在0,4,則一次只需要讀乙個資料塊,cpu的讀取指令就是一次原子操作。

C 記憶體對齊原則及作用

內建型別資料成員 結構 struct class 的內建型別資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員的起始位置要從自身大小的整數倍開始儲存 結構體作為成員 如果乙個結構裡有某些結構體成員,則結構體成員要從其內部 最寬基本型別成員 的整數倍位址開始儲存 如struct a裡...

c c 結構體 記憶體對齊原則

原則1 資料成員對齊規則 結構的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的倍數開始 比如int在32位機為4位元組,則要從4的整數倍位址開始儲存 原則2 結構體的總大小,也就是sizeof的結果。必須是其內部最大成員的整數倍。不足的要補齊。原則...

記憶體對齊的原則以及作用

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