struct對齊方式

2021-07-01 18:10:02 字數 2157 閱讀 2783

結構體的記憶體分配原則   

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

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

原則3、收尾工作:結構體的總大小,也就是sizeof的結果,必須是其內部最大成員(若結構體內部含結構體成員,則求出該結構體成員的最寬資料型別,和 原結構體中最寬基本型別比較,取兩者的最大值作為 整個結構體的內部最大成員)的整數倍,不足的要補齊。

這三個原則具體怎樣理解呢?我們看下面幾個例子,通過例項來加深理解。

例1:struct a;

structb;

sizeof(a) = 6; 這個很好理解,a1 offset為0,short佔2位元組,此時判斷a2,a2 為 short, 佔2位元組,所以其儲存的起始位置必須從2的整數倍開始,而a1剛好2個位元組,所以a1之後不需要填充。同樣的道理,a3佔兩個位元組。此時總共佔6位元組,根據原則3,總空間大小必須為其最大元素的整數倍,6滿足是2的整數倍,所以a佔6位元組。

sizeof(b) = 8; 這個比是不是比預想的大2個位元組?long為4,short為2,整個為8,因為原則3。

例2:struct a;

struct b;

sizeof(a) = 8; int為4,char為1,short為2,這裡用到了原則1和原則3。

sizeof(b) = 12; 是否超出預想範圍?char為1,int為4,short為2,怎麼會是12?還是原則1和原則3。

深究一下,為什麼是這樣,我們可以看看記憶體裡的布局情況。

a b c

a的記憶體布局:1111, 1*, 11

b a c

b的記憶體布局:1***, 1111, 11**

其中星號*表示填充的位元組。a中,b後面為何要補充乙個位元組?因為c為short,其起始位置要為2的倍數,就是原則1。c的後面沒有補充,因為b和c正好占用4個位元組,整個a占用空間為4的倍數,也就是最大成員int型別的倍數,所以不用補充。

b中,b是char為1,b後面補充了3個位元組,因為a是int為4,根據原則1,起始位置要為4的倍數,所以b後面要補充3個位元組。c後面補充兩個位元組,根據原則3,整個b占用空間要為4的倍數,c後面不補充,整個b的空間為10,不符,所以要補充2個位元組。

再看乙個結構中含有結構成員的例子:

例3:struct a;

struct b;

sizeof(a) = 24; 這個比較好理解,int為4,double為8,float為4,總長為8的倍數,補齊,所以整個a為24。

a                         b                  c   

a的記憶體布局:1111, * * * *, 1111, 1111, 1111, * * * *

sizeof(b) = 48; 看看b的記憶體布局。

e f g h i

b的記憶體布局:11* *, 1111, 11111111, 11 * * * * * *, 1111* * * *, 11111111, 1111 * * * *

i其實就是a的記憶體布局。i的起始位置要為8的倍數,所以h後面要補齊。最後總的位元組數必須是內部最大成員的整數倍,如果有結構體子成員,求出結構體子成員中最寬型別和原結構體中最寬基本型別中的最大值作為最大成員 。 b的記憶體布局弄清楚,有關結構體的對齊方式基本就算掌握了。b 為 48位元組,為最大資料成員double 的整數倍。

struct a;

// a 16位元組;

struct b;

b: 11** 1111 1111 11** 1111**** 11111111 11****** , 40個位元組;注意最後的填充6位元組,是為了滿足條件3(其中,最寬資料型別為 struct a 中的double型別)

Struct對齊方式

畢業前找工作的經歷讓我發現,很多公司的筆試 面試題中都涉及到了struct的對齊的問題!今天我們就深入探索其中的奧秘!預設情況下,編譯器為結構體的每個 成員按其自然對界 natural alignment 條件分配空間。各個成員按照它們被宣告的順序在記憶體中順序儲存,第乙個成員的位址和整個結構的位址...

struct 成員的對齊方式

用乙個巨集定義find求結構體struct s中某個成員變數member相對struct s的偏移量.思考 若struct s的位址為0,則其成員member的位址就是其相對於s的偏移量 擴充套件 1 sizeof struct s 不一定等於 sizeof struct s中的每乙個成員 的和 2...

struct 結構體內存對齊方式

以下都以32位機器為例分析結構體型別的變數在記憶體裡的儲存 一 1.結構體變數的儲存位置都是在記憶體中尋找位址是該變數自身大小整數倍開始儲存的。2.結構體型別變數的總大小應是該型別成員中最大資料型別的整數倍。就此兩點,可以解決所有問題,對於第一條,應該注意每一位成員存放的首位址定為自身的整數倍。例子...