1. 程式人生 > >C語言結構體佔用空間記憶體大小解析

C語言結構體佔用空間記憶體大小解析

結構體的資料型別的有點我們就不囉嗦了,直接來看相同資料結構體的幾種書寫的格式吧。

格式一:

01.struct tagPhone  
02.{  
03.     char   A;  
04.     int    B;  
05.     short  C;  
06.}Phone;

格式二:
01.struct tagPhone  
02.{  
03.     char   A;  
04.     short  C;  
05.     int    B;  
06.}Phone2; 


格式三:
01.struct tagPhone3  
02.{  
03.     char   A;  
04.     char   B[2];  
05.     char   C[4];  
06.}Phone3; 


我們都知道,char型別佔用1個位元組,int型佔用4個位元組,short型別佔用2個位元組,long佔用8個,double佔用16個;

那麼我們可能會犯一個錯誤就是直接1+4+2=7,該結構體佔用7個位元組。這是錯的。

以下我們簡單分析下:

計算結構體大小時需要考慮其記憶體佈局,結構體在記憶體中存放是按單元存放的,每個單元多大取決於結構體中最大基本型別的大小。

對格式一:

            

以int型佔用4個來作為倍數,因為A佔用一個位元組後,B放不下,所以開闢新的單元,然後開闢新的單元放C,所以格式一佔用的位元組數為:3*4=12;

同理對於格式二,

       A後面還有三個位元組,足夠C存放,所以C根著A後面存放,然後開闢新單元存放B資料。所以格式二佔用的記憶體位元組為2*4=8. 對於格式三:    

上面結構計算大小,sizeof(Phone3) = 1 + 2 + 4 = 7, 其大小為結構體中個欄位大小之和,這也是最節省空間的一種寫法。

總結:

 第一種寫法,空間浪費嚴重,sizeof 計算大小與預期不一致,但是保持了每個欄位的資料型別。這也是最常見的漫不經心的寫法,一般人很容易這樣寫;

     第三種寫法,最節省空間的寫法,也是使用 sizeof 求大小與預期一樣的寫法,但是全部使用位元組型別,丟失了欄位本生的資料型別,不方便使用;

     第二種寫法,介於第一種和第三種寫法之間,其空間上比較緊湊,同時又保持了結構體中欄位的資料型別。

     只要瞭解是這些寫法的差異性,可以視情況選用。

免責聲音:部分內容參考網路,如有侵權請第一時間倆系我,我將第一時間刪除。