一. 基本原則html
1. struct中成員變量的聲明順序,與成員變量對應的內存順序是一致的;數組
2. struct自己的起始存儲地址必須是成員變量中最長的數據類型的整倍數,注意是最長的數據類型,而不是最長的變量spa
3. 內存對齊與編譯器設置有關。3d
二. 計算規則(如下的全部規則,必須同時知足,並非知足其中一條便可)htm
1. 每一個成員變量相對於struct起始地址的偏移量,必須是成員變量自身類型長度的最小整倍數blog
int number;是聲明的第一個成員變量,相對於S001起始地址的偏移量爲0內存
double tmp; 是聲明的第二個成員變量,類型double長度8,根據規則1偏移量必須是8的最小倍數,當前偏移量是4,須要補充4個字節,則偏移量爲8get
2. 結構體內存大小,必須是成員變量中類型長度最長者的整倍數,若是不是,則在最後一個成員變量後補齊編譯器
根據1,int number和double tmp在內存中樣式以下:it
char c;是聲明的第三個成員變量,類型char 1字節,偏移量爲16
如今內存是17個字節,結構體S002中成員變量double tmp類型最長8個字節,17不能整除8,能整除8的最小數是24,則在char c後填補7個字節到24個字節
3. 成員變量是數組時,按照類型長度對齊,而不是數組長度對齊
int number;是聲明的第一個成員變量,相對於S001起始地址的偏移量爲0
char c[10];是聲明的第二個成員變量,類型char 1字節,數組長度10,注意是按照類型char 1字節計算偏移量,偏移量4
double tmp; 是聲明的第三個成員變量,類型double長度8,根據規則1偏移量必須是8的最小倍數,當前偏移量是14,須要補充2個字節,則偏移量爲16
一共24字節,是最大類型double長度8的整倍數
4. 成員變量是結構體時,根據struct基本原則,其存儲偏移量必須是成員變量中最長的數據類型的整倍數(當進行規則2的判斷時,結構體變量也是使用成員變量中最長類型,結合上邊幾條規則,這個其實很好理解的)
這裏運行3組數據進行驗證:
4-1> 以下圖所示,結構體S004中結構體成員變量 S041 s41,結構體S041中成員變量的類型最長是1,所以s41的偏移量爲14
4-2> 下圖爲另外一組結果圖, 結構體S004中結構體成員變量 S041 s41,結構體S041中成員變量的類型最長是int 4,S004.c[10]的偏移量爲4,長度爲10,即結束位置是14,14不能整除4,所以S004.s41的偏移量補齊到16
4-3> 下圖中結構體S041中成員變量的類型最長是int 4,S004.c[10]偏移量爲16,長度10,即結束位置爲26,26不能整除4,因此補齊到28
5. 成員變量是聯合體時,union的基本原則與struct同樣,其存儲偏移量必須是成員變量中最長的數據類型的整倍數,而且當進行規則2的判斷時,聯合體變量也是使用成員變量中最長類型(關於union的基本介紹,請看這裏http://www.cnblogs.com/xieyajie/p/8086861.html)