結構體和共用體 記憶體對齊原則

2021-09-01 12:54:10 字數 1997 閱讀 9508

結構體:結構體(struct)是由一系列具有相同型別或不同型別的資料構成的資料集合。結構體變數所佔記憶體的長度是各個成員的總和,每個成員分別占有自己的儲存空間。

關鍵字:struct。

共用體:共用體(union)把幾種不同資料型別的變數存放在同一塊記憶體裡,共用體中的變數共享同一塊記憶體,後賦值的會覆蓋重寫前面記憶體空間。共用體變數所佔記憶體的長度為定義時的最長成員的長度。

關鍵字:union。

struct 結構體名

;union 共用體名

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

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

3:收尾工作:結構體的總大小,也就是sizeof的結果,.必須是其內部最大成員的整數倍.不足的要補齊。

例子1:

struct data1

;

1.首先根據原則2判斷成員中基本資料型別儲存位元組大小最大的為double型別,因此以8位元組對齊。

2.從上往下,d為double分配8位元組,i為int分配4位元組,同時i後面的成員c1,c2為char型別,儲存大小為1位元組,編譯器編譯時認為沒必要各自分配8位元組,可以接在i後面共用乙個8位元組,所以i,c1,c2 = 4+1+(3+6)=14(這裡char[9]為單個單個位元組儲存,所以可以拆分開),14位元組不為8的倍數,根據原則3補齊為16位元組。 

第乙個8位元組:

第二個8位元組:

第三個8位元組:

di+c1+c2[1]+c2[2]+c2[3]

c2[4]+...+c2[9]

3.總的大小為 8+16=24,即sizeof(struct data1) 的值為 24。

例子2:

struct data2

1.首先判斷成員中基本資料型別儲存位元組大小最大的為double型別,因此以8位元組對齊。

2.從上往下,a為4位元組對齊為8,b,c為8位元組,d為4位元組,e為1位元組,f為2位元組,d+e+f為7,所以對齊並公用乙個8位元組。

第乙個8位元組:

第二個8位元組:

第三個8位元組:

第四個8位元組:ab

cd+e+f

例子3:

struct data4

1.最大為char*型別,以8位元組對齊。

2.l為4補齊為8位元組,s為8位元組,i+c+a[1]+a[2]為7位元組補齊為8位元組,a[3]+a[4]+a[5]為6補齊8位元組。

3.總位元組為 8+8+8+8=32。

3.8+8+8+8=32,即sizeof(struct data2) 的值為 32。

例子4(共用體巢狀結構體):

struct inner

;union data3

;

1.首先可以判斷共同體內最大基礎型別為double,對齊位元組為8。

2.共用體的記憶體大小由成員中最大的決定,除了結構體t1,最大的為d。

3.我們單獨來看結構體t1的位元組長度,根據記憶體對齊原則2,結構體(共用體)內的結構體(共用體)成員對齊位元組為其結構內部的最大元素,可以看出inner結構體內最大的基礎型別為int,即對齊位元組為4,c1補齊4位元組.i為4位元組,c2補齊4位元組,總的為12位元組。

4.所以共用體內最大元素t1占用記憶體為12位元組,而對齊位元組為8,所以將12補齊為16位元組,即sizeof(union data3)的值為16。

本章內容例子參考《linux c程式設計實戰》一書。

記憶體對齊原則**部落格。

結構體內存對齊 和共用體

這個人寫得差不多了.關於結構體內存對齊 差不多一般的就 3條 自己算去吧 struct p1 struct p2 struct p3 struct p4 struct p5 全部算對應該 才開始啊.struct a struct b sizeof struct b 64位機器上是 32 首先 cha...

結構體和共用體的記憶體對齊

編譯器按照成員列表的順序乙個接乙個地給每個成員分配記憶體。只有當儲存成員時需要滿足正確的邊界對齊要求時,成員時間才可能出現用於填充的額外記憶體空間。系統禁止編譯器在乙個結構的起始位置跳過幾個位元組來滿足邊界對齊要求,因此所有結構的起始位置必須是結構中邊界要求最嚴格的資料所要求的位置。這段話來自 c和...

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

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