爲什麼在我的課上有功能不會改變這個班級的大小?這個信息必須存儲在某個地方,但是在哪裏?爲什麼功能是失重的?
回答
你能想到的一個成員函數的作爲就像任何其他的功能,不同的是它有一個額外的隱藏參數,需要一個指針在其成員函數是實例調用。
例如,這樣的:
class C
{
void f(int i) { }
};
可能被實現(至少在概念上)爲:
void C_f(C* this, int i) { }
如果它是一個const成員函數,則隱藏參數將具有類型const C*
代替。請注意,虛擬成員函數的情況並非如此簡單。
@Knowing:此信息靜態鏈接到使用該方法的任何調用。 – 2010-05-26 19:56:05
@知道:這裏不需要叫名字。這既粗魯又不專業。 – 2010-05-26 19:56:19
@Knowing:編譯器將地址硬編碼到調用函數中,不需要在運行時將其作爲對象的一部分。相比之下,虛擬函數僅在運行時被解析,並且將虛擬函數表的指針添加爲每個對象的開銷。 – josefx 2010-05-26 20:07:57
我認爲(我傾向於是錯誤的大部分時間),如果你只有在一個類中聲明非虛函數,但沒有實現的連接器可能會刪除它一起。
class Toto
{
int foo();
};
M.
即使你有一個實現,大小不會改變。成員函數(如果它是非虛擬的)不存儲在類實例中。程序中只有一個副本(忽略靜態問題)。 – 2010-05-26 19:47:16
的sizeof(TheClass)
僅由類內的數據成員,以及如果存在任何虛函數表,再加上如果有任何填充字節受到影響。因此,向類中添加非虛函數不會影響其大小。如果該課程已經包含虛擬功能,則添加第二個虛擬功能也不會更改sizeof(TheClass)
。
@我知道,在程序的代碼段中,我猜。 – 2010-05-26 19:55:33
@知曉:機器語言指令存儲在可執行的二進制文件中,就像它們用於程序中的任何其他功能一樣。如果你認爲你對你的評論很有趣,你就不會。 – 2010-05-26 19:55:44
@丹尼爾感謝你的回答,並根據你的評論,我試圖變得有趣? – 2010-05-26 19:57:53
- 1. waitForSelector(「...」,功能成功()/功能失效()目的是什麼?
- 2. 爲什麼不能重載RHR功能?
- 3. 什麼是真正的重入功能?
- 4. getEvdoDbm()的功能是什麼?
- 5. bios的功能是什麼?
- 6. bootstrap.cache.php的功能是什麼?
- 7. 「(ClassName *)」的功能是什麼
- 8. !DOCTYPE的功能是什麼?
- 9. sudo的功能是什麼?
- 10. I()的功能是什麼?
- 11. forkN的功能是什麼?
- 12. SOCK_STREAM的功能是什麼?
- 13. Android:ContentResolver.update()的功能是什麼?
- 14. SetDefaultItem的功能是什麼?
- 15. Silverlight的功能是什麼?
- 16. CONFIG_X86_WP_WORKS_OK的功能是什麼?
- 17. HttpContext.Current.Request的功能是什麼?
- 18. 不知道爲什麼我的功能不是一個功能?
- 19. 爲什麼我的功能不是功能?
- 20. 爲什麼是一次性功能?
- 21. 你稱之爲功能語言功能是什麼?
- 22. 爲什麼foo不是零 - 或功能內功能
- 23. 什麼是免費功能?
- 24. 什麼是Y功能?
- 25. 什麼是OracleXEUniv.exe功能?
- 26. 什麼是阻塞功能?
- 27. 什麼是「頁面功能」?
- 28. Python:什麼是`is`功能?
- 29. 是什麼功能NHibernate
- 30. BDD,什麼是功能?
你能顯示一些代碼嗎? – Max 2010-05-26 19:43:32
「這個類的大小」,你的意思是目標文件的大小,或者「sizeof(TheClass)',或者......? – 2010-05-26 19:44:39
學會提出更好的問題。就像在你的問題中說明「fnc」是什麼一樣。 – 2010-05-26 19:47:41