取決於情況,但通常情況下,如果您打開了優化,則不應該比C版貴。你真正「付出」this
和其他功能的唯一時機是當你使用繼承和虛函數時。除此之外,編譯器足夠智能,不會浪費時間在this
中,因爲它沒有使用它。考慮以下幾點:
#include <iostream>
void globalDoStuff()
{
std::cout << "Hello world!\n";
}
struct Dummy
{
void doStuff() { callGlobalDoStuff(); }
void callGlobalDoStuff() { globalDoStuff(); }
};
int main()
{
globalDoStuff();
Dummy d;
d.doStuff();
}
與GCC優化級別O3
編譯,我得到以下拆裝(切斷多餘的垃圾,只是顯示main()
):
_main:
0000000100000dd0 pushq %rbp
0000000100000dd1 movq %rsp,%rbp
0000000100000dd4 pushq %r14
0000000100000dd6 pushq %rbx
0000000100000dd7 movq 0x0000025a(%rip),%rbx
0000000100000dde leaq 0x000000d1(%rip),%r14
0000000100000de5 movq %rbx,%rdi
0000000100000de8 movq %r14,%rsi
0000000100000deb callq 0x100000e62 # bypasses globalDoStuff() and just prints "Hello world!\n"
0000000100000df0 movq %rbx,%rdi
0000000100000df3 movq %r14,%rsi
0000000100000df6 callq 0x100000e62 # bypasses globalDoStuff() and just prints "Hello world!\n"
0000000100000dfb xorl %eax,%eax
0000000100000dfd popq %rbx
0000000100000dfe popq %r14
0000000100000e00 popq %rbp
0000000100000e01 ret
注意到它完全優化掉兩個Dummy
和globalDoStuff()
,並用globalDoStuff()
正文替換它。 globalDoStuff()
甚至沒有被調用過,也沒有構造過Dummy
。相反,編譯器/優化器會用兩個系統調用來替換該代碼,以直接打印出"Hello world!\n"
。教訓是,編譯器和優化器相當聰明,一般來說你不會爲你不需要的東西付費。
另一方面,假設您有一個成員函數來操作Dummy
的成員變量。你可能會認爲這與C函數相比有點懲罰,對吧?可能不會,因爲C函數需要一個指向要修改的對象的指針,當您考慮它時,它正是開頭的指針。
所以一般情況下,您不會爲C++相比於C支付this
額外的費用。虛擬函數可能會有一個(小)懲罰,因爲它必須查找適當的函數來調用,但情況並非如此在這裏考慮。
如果你沒有在你的編譯器中啓用優化,那麼當然,可能會有一個懲罰,但是......爲什麼你會比較非優化的代碼呢?
您無法真正調用指向對象的指針。我認爲你要找的詞是pass,除非你測量成員和非成員函數之間完全相同的很大差異,否則不值得打擾。 – chris
你是什麼意思「叫這個指針」。你的意思是把'this'作爲一個參數嗎? – Pubby
直到遇到性能問題時才進行微優化。做更有意義的事,而不是更快。 –