空類及空的虛函數占多少字節
阿新 • • 發佈:2017-08-30
div pri 空間 c++ 就會 [] 析構 指向 spa
運行下面的代碼,輸出是什麽?
class A { }; class B { public: B() {} ~B() {} }; class C { public: C() {} virtual ~C() {} }; int _tmain(int argc, _TCHAR* argv[]) { printf("%d, %d, %d\n", sizeof(A), sizeof(B), sizeof(C)); return 0; }
答案是1, 1, 4。class A是一個空類型,它的實例不包含任何信息,本來求sizeof應該是0。
但當我們聲明該類型的實例的時候,它必須在內存中占有一定的空間,否則無法使用這些實例。至於占用多少內存,由編譯器決定。
Visual Studio 2008中每個空類型的實例占用一個byte的空間。
class B在class A的基礎上添加了構造函數和析構函數。
由於構造函數和析構函數的調用與類型的實例無關(調用它們只需要知道函數地址即可),在它的實例中不需要增加任何信息。所以sizeof(B)和sizeof(A)一樣,在Visual Studio 2008中都是1。
class C在class B的基礎上把析構函數標註為虛擬函數。C++的編譯器一旦發現一個類型中有虛擬函數,就會為該類型生成虛函數表,並在該類型的每一個實例中添加一個指向虛函數表的指針。在32位的機器上,一個指針占4個字節的空間,因此sizeof(C)是4。
空類及空的虛函數占多少字節