struct 大小計算

2021-09-08 22:21:48 字數 2210 閱讀 2933

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

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

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

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

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

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

下面是乙個示例:

struct s1;

struct s2;

int main()

**中offsetof函式可以得到結構體成員相對於該結構體首位址的偏移量。

其執行結果如下圖

對於結構體s1來說,

ch是其第乙個成員故其位址和結構體的位址是相同的也就是說偏移量為0;

a是int型其大小為4個位元組,按照條件(2) 結構體每個成員位址相對於結構首位址的偏移量(offset)是該成員大小的整數倍,如果不是則編譯器會在成員之間新增填充位元組,所以其位址偏移應該是4,也就說編譯器在第乙個成員ch後面填充了3個位元組。

b是double型佔8個位元組,其位址偏移應該是8的整數倍,由於a的位址偏移是4其大小為4個位元組,正好b的偏移位址是8,不需要填充位元組。

c1是char型佔1個位元組,偏移位址是16(b的偏移位址是8大小也是8,中間也沒有填充位元組)。

這時成員ch佔1個位元組後面有3個位元組的填充,a佔4個位元組後面無填充,b佔8個位元組後面無填充,c1佔1個位元組,s1總的大小是\(1 + 3 + 4 + 8 + 1 = 17\)。按照條件(3)結構體總的大小需是其最大成員所佔空間的整數倍,其最大的成員b占有8位元組,17顯然是不符合條件的,所以需要在結構體的末尾填充7個位元組,最後結構體總的大小是24位元組

結構體s2和s1的成員是非常相似的,唯一的區別是其末尾沒有最後7個位元組的填充,所以其大小是16個位元組,這裡用於和s1做對比說明s1末尾的填充位元組。

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

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

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

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

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

如果n大於結構體成員中最大成員的大小,則n不起作用,仍然按照預設方式對齊。

示例仍然是上面的s1和s2,不過使用

#pragma pack(4)
設定按照4位元組對齊

執行結果

結果分析

ch是其第乙個成員故其位址和結構體的位址是相同的也就是說偏移量為0;

a佔4個位元組,和設定的對齊方式相等,所以其位址偏移是其大小的整數倍為4。

b佔8個位元組,大於設定的對齊方式4,所以其位址偏移是n的整數倍為8。

c1佔1個位元組,小於設定的對齊方式,所以其位址偏移是其大小的整數倍為16。

總的大小17個位元組,不是n(4)的整數倍,所以在結構體的末尾填充3個位元組,總的大小為20個位元組。

說明:在使用#pragma pack設定對齊方式一定要是2的整數冪,也就是(1,2,4,8,16,...),不然不起作用的,仍然按照預設方式對齊。當結構體中有其他的結構體作為成員時,計算最大成員是不能把結構體成員作為乙個整體來計算,要看其每個成員的大小。

struct大小計算

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

struct結構體大小計算

c c 中結構體大小的計算 結構體大小與屬性型別和它的儲存結構有關,總結來說便是 結構體大小總是其中屬性最大型別的整數倍大小 以所佔位元組最大的屬性為基本單位進行屬性劃分 例 struct mystruct 該結構體大小為44 分析 char a 20 20位元組 int x 4位元組 float ...

union和struct的大小計算

宣告 整理自網路。規則 1,對於union,對齊的大小是最大的基本元素的對齊大小 物件的大小必須是該基本元素大小的整數倍 2,對於struct,對齊的大小也是最大的基本元素的對齊大小,物件的大小需要考慮元素的對齊,並且需要是最大基本元素的整數倍 同時有 pragma pack修飾的情況,關於stru...