struct結構體內存大小

一. 基本原則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

相關文章
相關標籤/搜索