結構是乙個或多個變數的集合,這些變數可能為不同的型別,為了處理的方便而將這些變數組織在乙個名字之下。struct型別的計算分為三步:先算struct的對齊大小,對齊的大小也是取決於struct成員中位元組對齊最大的那個;然後根據每個成員的對齊大小對齊每個成員算出分配的空間;最後算出struct實際分配的空間,在滿足對齊每個成員的基礎上,滿足是struct對齊大小的整數倍。
struct s1
;對齊大小為8,對齊每個成員後大小為24,正好是8的整數倍,所以實際分配的大小就為24。
struct s2
;s1對齊大小為8,u1對齊大小為4,因此s2的對齊大小8,體積大小為大於24+12且要為8的倍數,結果為40。
這裡所說的union和struct的對齊,是指其作為其他複雜物件中的元素的時候要求的對齊,對於本身大小的計算並沒有關係。本身的大小只和其所包含的基本元素的對齊有關係。
struct的大小和內部元素的排列是有很大關係的,而union裡元素排序沒關係,因此在使用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)// pack(0)會採用預設的位元組(4)
則對於u3中的基本元素b,其對齊由原來的8變為4,而a的對齊仍然是1,則u3的對齊為4,大小為12。
當然u3的對齊也由8變成了4。
sizeof計算struct大小
題目 s的輸出結果 include struct s struct s next int main 答案 16 struct的sizeof不是成員型別大小的簡單相加,對齊!1 sizeof應用在結構上的情況 請看下面的結構 struct mystruct 對結構mystruct採用sizeof會出現...
sizeof計算struct大小
1 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 2 結構體每個成員相對於結構體首位址的偏移量 offset 都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組 internal adding 3 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成...
struct大小計算
sizeof struct 大小討論 針對位元組對齊,環境使用的gcc version 3.2.2編譯器 32位x86平台 為例。char 長度為1個位元組,short 長度為2個位元組,int 長度為4個位元組。struct 子項在記憶體中的按順序排列,在沒有 progma pack n 引數的情...