1:資料成員對齊規則:結構(struct)(或聯合(union))的資料成員,第乙個資料成員放在offset為0的地方,每個資料成員儲存的起始位置要從該成員(每個成員本身)大小的整數倍開始(比如int在32位機為4位元組,則要從4的整數倍位址開始儲存)。
例子:
0是任何數的整倍數,char的大小為1,int大小為4;
struct
node
;sizeof(node)=
8
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的整數倍位址開始儲存)。
例子:
0是任何數的整倍數,char的大小為1,int大小為4;
struct
node
;sizeof(node)=
8
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,第二個格仔已經被...