C語言結構體佔用空間記憶體大小解析
阿新 • • 發佈:2019-01-03
結構體的資料型別的有點我們就不囉嗦了,直接來看相同資料結構體的幾種書寫的格式吧。
格式一:
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 求大小與預期一樣的寫法,但是全部使用位元組型別,丟失了欄位本生的資料型別,不方便使用;
第二種寫法,介於第一種和第三種寫法之間,其空間上比較緊湊,同時又保持了結構體中欄位的資料型別。
只要瞭解是這些寫法的差異性,可以視情況選用。
免責聲音:部分內容參考網路,如有侵權請第一時間倆系我,我將第一時間刪除。