一、記住以下四條規則:
①:第乙個成員在與結構體變數偏移量為0的位址處。
②:其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。對齊數=編譯器預設的乙個對齊數與該成員大小的較小值,在vs環境下預設值為8,在linux環境下預設值為4。
③:結構體的總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍。
④:如果巢狀了結構體的情況,被巢狀的結構體對齊到其自身對齊數的整數倍處(結構體的對齊數就是其內部成員中最大的對齊數),此時結構體的整體大小就是所有最大對齊數(含被巢狀結構體的對齊數)的整數倍。
二、怎麼理解上面四條規則?
1.結構體每個成員變數都有乙個偏移量;
2.乙個結構體成員變數大小=實際大小+偏移量;
3.偏移量=下乙個結構體變數對齊數-本身大小;
4.對齊數=min(成員變數大小,預設對齊數);
5.結構體總大小可以被最大對齊數整除(不能被整除就要補齊到可以被整除為止);
舉例:
// 計算結構體大小
strcut foo
1.想要計算a的大小,先算b的對齊數,b的對齊數=min(4,4);也就是4,a比b的對齊數小,那麼就需要偏移3對齊到4,從位址4開始計算b的大小,所以a=4。
2.再來說b的大小,先計算c的對齊數,c的對齊數=min(2,4);也就是2,b比c的對齊數大,所以不需要偏移對齊,b的大小就等於本身大小4,所以b=4。
3.最後計算c的大小,c的對齊數就是2,那它本身大小就等於2。
結構體總大小等於(4+4+2)也就是6,但是6不能被最大對齊數4整除,所以需要偏移2到8,所以總大小就等於8。
結構體大小方式計算
我們實際生活中,儲存的資料一般不會是同一種型別,所以引入了結構體。而結構體的大小也不是成員型別大小的簡單相加。需要考慮到系統在儲存結構體變數時的位址對齊問題。對齊方式很浪費空間,可按照計算機的訪問規則,這種對齊方式提公升了效率。結構體成員的偏移量必須是成員大小的整數倍 0被認為是任何數的整數倍 結構...
記憶體對齊(計算結構體大小)方法
struct stu1 結構體大小等於最後乙個成員的偏移量加上最後乙個成員的大小。第乙個成員i的偏移量為0。第二個成員c的偏移量是第乙個成員的偏移量加上第乙個成員的大小 0 4 其值為4 第三個成員j的偏移量是第二個成員的偏移量加上第二個成員的大小 4 1 其值為5。由於儲存變數時位址對齊的要求,編...
C語言 計算結構體大小
結構體中的成員可以是不同的資料型別,成員按照定義時間的順序依次儲存在連續的記憶體空間。和陣列不一樣的是,結構體的大小不是所有成員大小簡單的相加,需要考慮到系統在儲存結構體變數時的位址對其問題。結構體對齊規則 通入下面例題,計算結構體大小 題1 struct s1 題2 struct s2 題3 st...