union
和struct
型別的大小計算:對於
union
,對齊的大小是最大的基本元素的對齊大小,物件的大小必須是該基本元素大小的整數倍。如:
union u1
;對齊為
4位元組對齊,大小為大於
9並且為
4的倍數,為12。
若其中的
int b
改為double
,則對齊為
8,大小為16。
複雜一點的情況
:union u2
;對齊是
double
的大小,為
8,大小應當為是16。
對於stuct
,對齊的大小也是最大的基本元素的對齊的大小,物件的大小需要考慮元素的對齊,並且需要是最大基本元素的整數倍。
struct s1
;對齊大小為
8,大小為24。
struct s2;s1
對齊大小為8,
u1對齊大小為
4,因此
s2的對齊大小
8,體積大小為大於
24+12
且要為8
的倍數,結果為40。
這裡所說的
union
和struct
的對齊,是指其作為其他複雜物件中的元素的時候要求的對齊,對於本身大小的計算並沒有關係。本身的大小只和其所包含的基本元素的對齊有關係。
struct
的大小和內部元素的排列是有很大關係的,因此在使用
struct
的時候,安排好元素的位置,可以減少結構體的大小。如:
struct s3
;根據之前的原則,因為c需要
4位元組對齊,因此
b之後會有
3位元組空餘。所以
1+3(
空餘)+4+13=21
,要求為
4的倍數,則為24。
若更改為
struct s4則c
之前會空餘
2位元組,所以
1+13+2+4=20
,並且已經為
4的倍數,所以大小就是20。
關於#pragma_pack()
,該標示用於重新指定對齊的大小,當元素的對齊大於指定的對齊大小的時候,會採用指定的大小,若小於,則指定的對齊大小不會產生效果。如:
union u3;該
union
的對齊為
8,大小為
16(大於9且為
8的倍數)。
若加上#pragma_pack(4)
則對於u3
中的基本元素
b,其對齊由原來的8變為
4,而a的對齊仍然是1,則
u3的對齊為
4,大小為12。
當然u3
的對齊也由
8變成了4。
union和struct型別的大小計算
對齊就是要滿足儲存變數的起始位址與對齊大小餘數為0。對於union,分兩步 先算union對齊大小,對齊的大小是取決於union成員中位元組對齊最大的那個 再算union實際分配的空間,而分配給union的實際大小不僅要滿足是對齊大小的整數倍,同時要滿足實際大小不能小於最大成員的大小。如 union...
struct和union的大小
結構體預設對齊方式 在預設對齊方式下,結構體成員的記憶體分配滿足下面三個條件 1.第乙個成員的位址和結構體的首位址相同,即偏移量為0。2.結構體每個成員位址相對於結構體首位址的偏移量 offset 是該成員大小的整數倍,如果不是則編譯器會在成員之間新增填充位元組 internal adding 3....
struct和union的記憶體分配
struct struct結構體在分配記憶體時需要遵循記憶體對齊規則 1.結構體的起始儲存位置必須是能夠被該結構體中最大的資料型別所整除 2.前面單元的大小必須是後面單元大小的整數倍 每個資料成員儲存的起始位址必須是自身大小的整數倍 如果不夠就補齊 3.整個結構體的大小 即sizeof的結果 必須是...