在VC中,sizeof有著許多的用法,而且很容易引起一些錯誤。下面根據sizeof後面的參數對sizeof的用法做個總結。
A.參數為數據類型或者為一般變量:
例如sizeof(int),sizeof(long)等等。
這種情況要注意的是不同系統系統或者不同編譯器得到的結果可能是不同的。
例如int類型在16位系統中占2個字節,在32位系統中占4個字節。
B.參數為數組或指針:
int a[50]; //sizeof(a)=4*50=200;求數組所占的空間大小
int *a=new int[50];// sizeof(a)=4; a為一個指針,sizeof(a)是求指針的大小,在32位系統中,當然是占4個字節。
C.參數為結構或類:
Sizeof應用在類和結構的處理情況是相同的,需要考慮字節對齊(參加另一篇文章:C++自定義結構體和類 內存對齊)。另外有幾點需要注意:
第一、結構或者類中的靜態成員不對結構或者類的大小產生影響,因為靜態變量的存儲位置與結構或者類的實例地址無關。
第二、沒有成員變量的結構或類(非虛)的大小為1,因為必須保證結構或類的每一個實例在內存中都有唯一的地址。
第三、包含虛函數的類或者虛繼承的類,需要算上虛表指針的占的4個字節。
下面舉例說明:
Class Test{int a;static double c};//sizeof(Test)=4.
Test *s;//sizeof(s)=4,s為一個指針。
Class test1{ };//sizeof(test1)=1;
Class test2{ virtual void print(){}};//sizeof(test2)=4;