我們實際生活中,儲存的資料一般不會是同一種型別,所以引入了結構體。而結構體的大小也不是成員型別大小的簡單相加。需要考慮到系統在儲存結構體變數時的位址對齊問題。對齊方式很浪費空間,可按照計算機的訪問規則,這種對齊方式提公升了效率。
結構體成員的偏移量必須是成員大小的整數倍(0被認為是任何數的整數倍)
結構體大小必須是所有成員大小(陣列,結構體除外)的整數倍
首先要知道的是關鍵字佔多少個位元組:
struct s1
;
這個結構體的大小容易計算,滿足兩個原則即可,為8,那麼下面這個呢
struct s2
;
這個結構體大小是12,為什麼呢?仔細看看兩個原則,要滿足偏移量是成員的整數倍,ch1偏移量是0,i的偏移量不可能是1,因為1不是i大小4的倍數,所以i的偏移量是4,ch2的偏移量就變為了8,所以滿足結構體大小是成員大小整數倍,就是12。
struct s3
;
這個結構體的大小是20,先看前兩個成員,大小是8,毋庸置疑,這個char型別的陣列,只需要把它看做十個char連在一起即可,加起來就是18,再滿足結構體大小為成員整數倍,所以大小就是20。
struct s4
;float f;
};
這裡需要注意一下,裡面的結構體struct s的大小為8。但整體的大小卻為12。所以裡面的結構體大小並沒有算進去。因為裡面的結構體沒有進行宣告
我們來加個宣告:
struct s4demo;
float f;
};
加了宣告「demo」之後,整個結構體大小為20
struct s5;}
;
聯合體大小就是成員中最大型別的大小,所以這個結構體大小是12.
(1)對齊值小於最大型別成員值
#pragma pack(4)
//指定向4對齊 最大是8
struct s6
;
如果我們沒有指定對齊值,這個結構體大小是24,我們指定向4對齊,所以大小是4的倍數,所以結構體大小是20
(2)對齊值大於最大型別成員值
#pragma pack(10)
struct s7
;
我們指定的對齊值是10,最大為8,是否就向10對齊?不是,當指定對齊值大於自身對齊值時,向自身對其值對齊,大小是24. 記憶體對齊(計算結構體大小)方法
struct stu1 結構體大小等於最後乙個成員的偏移量加上最後乙個成員的大小。第乙個成員i的偏移量為0。第二個成員c的偏移量是第乙個成員的偏移量加上第乙個成員的大小 0 4 其值為4 第三個成員j的偏移量是第二個成員的偏移量加上第二個成員的大小 4 1 其值為5。由於儲存變數時位址對齊的要求,編...
c語言計算結構體大小方法
一 記住以下四條規則 第乙個成員在與結構體變數偏移量為0的位址處。其他成員變數要對齊到某個數字 對齊數 的整數倍的位址處。對齊數 編譯器預設的乙個對齊數與該成員大小的較小值,在vs環境下預設值為8,在linux環境下預設值為4。結構體的總大小為最大對齊數 每個成員變數都有乙個對齊數 的整數倍。如果巢...
計算結構體大小
運算子sizeof可以計算出給定型別的大小,對於32位系統來說,sizeof char 1 sizeof int 4。基本資料型別的大小很好計算,我們來看一下如何計算構造資料型別的大小。c語言中的構造資料型別有三種 陣列 結構體和共用體。陣列是相同型別的元素的集合,只要會計算單個元素的大小,整個陣列...