C C 中的結構體對齊原則

2021-08-21 06:35:32 字數 887 閱讀 9108

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)=12

b的起始位置要是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,第二個格仔已經被...