1. 程式人生 > >空類及空的虛函數占多少字節

空類及空的虛函數占多少字節

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。

空類及空的虛函數占多少字節