sizeof(struct)對齊方式

2021-07-23 12:12:12 字數 1071 閱讀 6566

結構體是一種復合資料型別,通常編譯器會自動的進行其成員變數的對齊,已提高資料訪問的效率。在預設情況下,編譯器為結構體的成員按照自然對齊(natural alignment)條方式分配儲存空間,各個成員按照其宣告順序在儲存器中順序儲存。自然對齊是指按照結構體中成員size最大的對齊,在cl編譯器下可以使用

#pragma pack(n)
來指定結構體的對齊方式。

在預設對齊方式下,結構體成員的記憶體分配滿足下面三個條件

結構體第乙個成員的位址和結構體的首位址相同

結構體每個成員位址相對於結構體首位址的偏移量(offset)是該成員大小的整數倍,如果不是則編譯器會在成員之間新增填充位元組(internal adding)。

結構體總的大小要是其成員中最大size的整數倍,如果不是編譯器會在其末尾新增填充位元組(trailing padding)。

特別注意和理解第二條,判斷大小的時候最好劃出圖。

可以使用#pragma pack(n)來指定結構體成員的對齊方式

對於指定的對齊方式,其成員的位址偏移以及結構的總的大小也有下面三個約束條件

結構體第乙個成員的位址和結構體的首位址相同

結構體每個成員的位址偏移需要滿足:n大於等於該成員的大小,那麼該成員的位址偏移需滿足預設對齊方式(位址偏移是其成員大小的整數倍);n小於該成員的大小,那麼該成員的位址偏移是n的整數倍

結構體總的大小需要時n的整數倍,如果不是需要在結構體的末尾進行填充。

如果n大於結構體成員中最大成員的大小,則n不起作用,仍然按照預設方式對齊。最後倆條可以簡化下即:

在有#progma pack(n)引數的情況,各子項的對齊係數為min(自己長度,n);

struct 整體的對其係數為子項對齊係數最大值

最後總結下,

預設對齊時,每個元素的距離首位址的偏移量,必須是該元素大小的倍數,struct整體大小必須是內部元素最大元素大小的倍數。

在progma pack(n)的情況下,各個元素距離首位址的偏移量min(本元素大小,n),struct整體大小必須是min(內部最大元素大小,n)的倍數。

sizeof struct 大小討論

2009 11 08 14 05 51 分類 c語言雜記 舉報 字型大小 訂閱 struct 結構大小和順序 progma pack引數有關係 針對位元組對齊,環境使用的gcc version 3.2.2編譯器 32位x86平台 為例。char 長度為1個位元組,short 長度為2個位元組,int...

sizeof struct 大小討論

struct 結構大小和順序 progma pack引數有關係 針對位元組對齊,環境使用的 gcc version 3.2.2 編譯器 32位 x86平台 為例。char 長度為1個位元組,short 長度為2個位元組,int 長度為4個位元組。struct 子項在記憶體中的按順序排列,在沒有 pr...

遇到sizeof struct 怎麼計算?

1 sizeof應用在結構上的情況 請看下面的結構 struct mystruct 對結構mystruct採用sizeof會出現什麼結果呢?sizeof mystruct 為多少呢?也許你會這樣求 sizeof mystruct sizeof double sizeof char sizeof in...