2010-05-26 62 views
-4

爲什麼在我的課上有功能不會改變這個班級的大小?這個信息必須存儲在某個地方,但是在哪裏?爲什麼功能是失重的?

+1

你能顯示一些代碼嗎? – Max 2010-05-26 19:43:32

+5

「這個類的大小」,你的意思是目標文件的大小,或者「sizeof(TheClass)',或者......? – 2010-05-26 19:44:39

+9

學會提出更好的問題。就像在你的問題中說明「fnc」是什麼一樣。 – 2010-05-26 19:47:41

回答

9

你能想到的一個成員函數的作爲就像任何其他的功能,不同的是它有一個額外的隱藏參數,需要一個指針在其成員函數是實例調用。

例如,這樣的:

class C 
{ 
    void f(int i) { } 
}; 

可能被實現(至少在概念上)爲:

void C_f(C* this, int i) { } 

如果它是一個const成員函數,則隱藏參數將具有類型const C*代替。請注意,虛擬成員函數的情況並非如此簡單。

+0

@Knowing:此信息靜態鏈接到使用該方法的任何調用。 – 2010-05-26 19:56:05

+9

@知道:這裏不需要叫名字。這既粗魯又不專業。 – 2010-05-26 19:56:19

+1

@Knowing:編譯器將地址硬編碼到調用函數中,不需要在運行時將其作爲對象的一部分。相比之下,虛擬函數僅在運行時被解析,並且將虛擬函數表的指針添加爲每個對象的開銷。 – josefx 2010-05-26 20:07:57

-1

我認爲(我傾向於是錯誤的大部分時間),如果你只有在一個類中聲明非虛函數,但沒有實現的連接器可能會刪除它一起。

class Toto 
{ 
    int foo(); 
}; 

M.

+4

即使你有一個實現,大小不會改變。成員函數(如果它是非虛擬的)不存儲在類實例中。程序中只有一個副本(忽略靜態問題)。 – 2010-05-26 19:47:16

2

sizeof(TheClass)僅由類內的數據成員,以及如果存在任何虛函數表,再加上如果有任何填充字節受到影響。因此,向類中添加非虛函數不會影響其大小。如果該課程已經包含虛擬功能,則添加第二個虛擬功能也不會更改sizeof(TheClass)

+2

@我知道,在程序的代碼段中,我猜。 – 2010-05-26 19:55:33

+0

@知曉:機器語言指令存儲在可執行的二進制文件中,就像它們用於程序中的任何其他功能一樣。如果你認爲你對你的評論很有趣,你就不會。 – 2010-05-26 19:55:44

+0

@丹尼爾感謝你的回答,並根據你的評論,我試圖變得有趣? – 2010-05-26 19:57:53