Dipende dalla situazione, ma in genere, se le ottimizzazioni sono attivate, non dovrebbe essere più costoso della versione C. L'unica volta in cui "paghi" veramente per this
e altre funzionalità è quando usi l'ereditarietà e le funzioni virtuali. Oltre a questo, il compilatore è abbastanza intelligente da non perdere tempo su this
in una funzione che non stai utilizzando. Si consideri il seguente:
#include <iostream>
void globalDoStuff()
{
std::cout << "Hello world!\n";
}
struct Dummy
{
void doStuff() { callGlobalDoStuff(); }
void callGlobalDoStuff() { globalDoStuff(); }
};
int main()
{
globalDoStuff();
Dummy d;
d.doStuff();
}
compilato con livello di ottimizzazione GCC O3
, ottengo il seguente smontaggio (il taglio della spazzatura in più e solo mostrando 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
Avviso completamente ottimizzato via sia la Dummy
e globalDoStuff()
e appena sostituito con il corpo di globalDoStuff()
. globalDoStuff()
non viene mai nemmeno chiamato, e non viene mai costruito Dummy
. Invece, il compilatore/ottimizzatore sostituisce quel codice con due chiamate di sistema per stampare direttamente "Hello world!\n"
. La lezione è che il compilatore e l'ottimizzatore sono abbastanza intelligenti, e in generale non pagherai per quello che non ti serve.
D'altra parte, si immagini di avere una funzione membro che manipola una variabile membro di Dummy
. Potresti pensare che questo abbia una penalità rispetto a una funzione C, giusto? Probabilmente no, perché la funzione C ha bisogno di un puntatore a un oggetto da modificare, che, quando ci si pensa, è esattamente ciò che il puntatore this
deve iniziare.
Quindi in generale non si paga un extra per this
in C++ rispetto a C. Le funzioni virtuali possono avere una (piccola) penalità in quanto deve cercare la funzione corretta da chiamare, ma non è così che siamo considerando qui.
Se non si attivano le ottimizzazioni nel compilatore, allora sì, certo, potrebbe esserci una penalità, ma ... perché dovresti confrontare il codice non ottimizzato?
Non si può realmente chiamare un puntatore a un oggetto. Penso che la parola che stai cercando sia passata e, a meno che tu non misuri una grande differenza tra le funzioni membro e non membro che sono esattamente le stesse, non vale la pena preoccuparti. – chris
Cosa intendi con "chiama questo puntatore". Intendi passare "questo" come argomento? – Pubby
Non eseguire l'ottimizzazione micro finché non si riscontrano problemi di prestazioni. Fai ciò che ha più senso, non ciò che è più veloce. –