2014-02-20 54 views
0

我想檢查一個類的大小。另外,我是C++的新手。我有兩個類, 兩個類之間的區別只是它有8個方法。在這兩個階級中,階級的大小沒有什麼區別。你能解釋我的概念嗎?爲什麼這兩個類具有相同的大小,該方法不構成一個類的大小?

#include <iostream> 

using namespace std; 

class A 
{ 

    int b; 
    char c[2]; 

    int func(int x, int y) 
    { 
     return x+y; 
    } 
    int func1(int x, int y) 
    { 
     return x+y; 
    } 
    int func2(int x, int y) 
    { 
     return x+y; 
    } 
    int func3(int x, int y) 
    { 
     return x+y; 
    } 
    int func4(int x, int y) 
    { 
     return x+y; 
    } 
    int func5(int x, int y) 
    { 
     return x+y; 
    }  
    int func6(int x, int y) 
    { 
     return x+y; 
    } 
    int func7(int x, int y) 
    { 
     return x+y; 
    } 
}; 

class B 
{ 

    int b; 
    char c[2]; 
}; 


int main() 
{ 
    cout<<"Size of class A is "<< sizeof(A)<<endl; 
    cout<<"Size of class B is "<< sizeof(B)<<endl; 

    return 0; 
} 

輸出如下 - 一個實例,而不是類本身的

$ ./class_size.out 
Size of class A is 8 
Size of class B is 8 
+1

他們爲什麼要這樣做?如果製作一百萬個對象,則不需要800萬份不必要的函數副本。 – chris

回答

4

沒錯。方法不會影響對象的大小。每個函數只有一個副本,並且這個作爲隱藏參數傳遞。

當您添加第一個虛擬函數時,您會注意到大小的增加,因爲具有虛擬函數的對象至少需要一個額外的指針來動態解析虛擬調用。

+0

用於提及虛擬方法。更多閱讀在這裏:http://stackoverflow.com/questions/4766323/how-to-determine-sizeof-class-with-virtual-functions – m24p

1

sizeof()措施的規模。類方法的程序代碼不與int bchar c[2]一起存儲;如果您擁有數百個具有數百個功能代碼副本的實例,那將會是一個巨大的內存浪費。

因此,一個類的每一個實例僅存儲部件變量(並且,在虛函數,一個vtbl指針情況)。功能代碼每個類只存儲一次,並且不影響實例大小。

0

通常,程序在內存中被分成多個段,堆棧和堆包含類和變量的實例,代碼段包含與方法和函數相關的指令。根據實例的數量,類中的指令佔用的空間不會增加。

sizeof運算符測量類實例的大小。這個實例要麼放在堆棧上,要麼放在堆上,這取決於你是否動態地爲它分配內存。

如果您將靜態成員變量創建爲類變量,並且不是sizeof的一部分。 (放在程序的數據段中)

相關問題