C C 中的結構體對齊原則

2021-10-10 14:05:57 字數 1958 閱讀 8800

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

例子:

struct

node

;sizeof(node)=

8

0是任何數的整倍數,char的大小為1,int大小為4;

a存放在0offset為位置,b儲存的起始位置為1,但不滿足對其原則,因為int大小為4,其儲存位置應為4的整倍數,因此要在a後補齊,使b儲存的起始位置為4

因此node大小為8

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

例子:

struct

pa

sizeof(pa)=

12b的起始位置要是

4的整倍數,因此要在a後補位,

b佔8位元組

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

例子:

struct

node

sizeof(node)=16按

1,2原則可計算出結果應為

9;但結構體大小應為最大成員的整倍數,因此結果應為

16

如果編譯器中提供了

#pragma

pack(n),上述對其模式就不適用了,例如設定變數以n

位元組對齊

方式,則上述成員型別對齊寬度(應當也包括收尾對齊)應該選擇成員型別寬度和n中較小者;

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

例子:

struct

node

;sizeof(node)=

8

0是任何數的整倍數,char的大小為1,int大小為4;

a存放在0offset為位置,b儲存的起始位置為1,但不滿足對其原則,因為int大小為4,其儲存位置應為4的整倍數,因此要在a後補齊,使b儲存的起始位置為4

因此node大小為8

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

例子:

struct

pa

sizeof(pa)=

12b的起始位置要是

4的整倍數,因此要在a後補位,

b佔8位元組

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

例子:

struct

node

sizeof(node)=16按

1,2原則可計算出結果應為

9;但結構體大小應為最大成員的整倍數,因此結果應為

16

如果編譯器中提供了

#pragma

pack(n),上述對其模式就不適用了,例如設定變數以n

位元組對齊

方式,則上述成員型別對齊寬度(應當也包括收尾對齊)應該選擇成員型別寬度和n中較小者;

C C 中的結構體對齊原則

資料成員對齊規則 結構 struct 或聯合 union 的資料成員,第乙個資料成員放在offset為0的地方,每個資料成員儲存的起始位置要從該成員 每個成員本身 大小的整數倍開始 比如int在32位機為 位元組,則要從 的整數倍位址開始儲存 例子 struct node sizeof node 8...

C C 結構體對齊原則

先介紹四個概念 1 資料型別自身的對齊值 基本資料型別的自身對齊值,等於sizeof 基本資料型別 2 指定對齊值 pragma pack value 時的指定對齊值value。3 結構體或者類的自身對齊值 其成員中自身對齊值最大的那個值。4 資料成員 結構體和類的有效對齊值 自身對齊值和指定對齊值...

C C 中結構體的對齊問題

首先需要知道記憶體是按照4位元組對齊的,看下面的結構體 typedef struct st type 記憶體可以看作長度為4的挨在一起的格仔,首先變數a b,長度為2,占用了第乙個格仔的頭兩個位置 變數c長度為4,第乙個格仔已經放不下,只能另起一格,從第二個格仔開始放置 然後變數d,第二個格仔已經被...