C精進 結構體對齊

2021-10-05 13:59:40 字數 834 閱讀 3971

乙個結構體的大小並不是其中包含的所有元素各自大小的簡單相加,編譯器會根據硬體進行相應的對齊優化,比如32位資料匯流排的晶元會進行4位元組對齊,方便進行資料傳輸。

看下面的**,結構體裡同樣儲存乙個char型別、乙個short型別和乙個int型別,如果簡單相加是1+2+4=7位元組。4位元組對齊要求占用空間是4的倍數,但不同的排列方式占用的大小也不一樣。

#include

#include

#include

intmain

(void

)st_a;

struct bst_b;

struct cst_c;

printf

("sizeofa:%d\n"

,sizeof

(st_a));

printf

("sizeofb:%d\n"

,sizeof

(st_b));

printf

("sizeofc:%d\n"

,sizeof

(st_c));

system

("pause");

return0;

}

輸出分別是12、8、8

結構體a的記憶體占用圖:

a_ _ _ b _ _ _ c _ _ _

結構體b的記憶體占用圖:

c_ a _ b _ _ _

結構體c的記憶體占用圖:

a_ c _ b _ _ _

編譯器會將連在一起放置的char和short進行優化,合起來占用4位元組,而不是分別佔4位元組。

c 結構體對齊

1 當前偏移量 當前填充數 當前變數大小 0 2 總偏移大小 末尾填充數 最寬變數大小 0 必須先滿足1 再滿足2。例如 如下 struct a 由上可知 總偏移量 4 1 1 2 末尾補數0 最寬變數大小4 0。所以sizeof a 8。即4 1 1 2 8 快速記憶 4 1 1 2 8 stru...

C語言 結構體struct 結構體對齊

1 定義乙個結構體 順便例項結構體變數 struct tag 結構體型別名 struct tag 這兩者共同構成了結構體型別 單獨的tag 結構體型別名 不能稱之為結構體型別 結構體變數名 2 定義的同時使用typedef 相當於定義結構體 為結構體起新名字 typedef struct tag 結...

c語言 結構體對齊

1 編譯器是按照什麼樣的原則進行對齊的?a.資料型別自身的對齊值 對於char型資料,其自身對齊值為1,對於short型為2,對於int,float,double型別,其自身對齊值為4,單位位元組。b.結構體或者類的自身對齊值 其成員中自身對齊值最大的那個值。c.指定對齊值 pragma pack ...