Per ragioni di argomenti, ignoriamo il caso banale degli ottimizzatori che rimuovono le differenze. Diciamo anche che stai usando le convenzioni di chiamata Intel a 64 bit di Microsoft (che differiscono dall'ABI di Linux), quindi hai 4 registri a 64 bit per passare tali valori prima di dover ricorrere a spingerli nello stack. Questo è chiaramente meglio.
Per un'applicazione a 32 bit, in base al valore, andrebbero direttamente nello stack. By-reference può invece mettere un puntatore in un registro (di nuovo, alcuni di questi usi del registro sono consentiti prima di ricorrere allo stack). Siamo in grado di questo in qualche uscita dal g ++ -O3 -S, chiamando f1 (99) per valore e f2 (101) con riferimento const:
void f1(int64_t);
void f2(const int64_t&);
int main()
{
f1(99);
f2(101);
}
...
pushl 0
pushl $99
call _Z2f1x // by value - pushed two halves to stack
leal -8(%ebp), %eax
movl %eax, (%esp)
movl $101, -8(%ebp)
movl $0, -4(%ebp)
call _Z2f2RKx // by const& - ugly isn't it!?!
La funzione chiamata sarebbe poi dovuto recuperare prima del primo utilizzo (se presente). La funzione chiamata è libera di memorizzare nella cache i valori letti nei registri, quindi è necessaria solo una volta. Con l'approccio stack, il valore può essere riletto a piacimento, quindi il registro non deve essere riservato per quel valore. Con l'approccio puntatore, potrebbe essere necessario salvare il puntatore o il valore a 64 bit in qualche luogo più prevedibile (es. Spinto, o un altro registro meno utile) nel caso in cui quel registro debba essere momentaneamente liberato per qualche altro lavoro, ma il 64-bit il parametro int sarà nuovamente necessario in seguito. Tutto sommato, è difficile indovinare quale sia più veloce - potrebbe essere dipendente dalla CPU/registro/ottimizzatore/ecc., E non vale la pena provarlo.
Un nodo per il consiglio di PST ...
"efficienza" :(BACIO passarlo come si passa ogni altro intero sanguinante -.. Pst
... anche se, a volte si applica BACIO a modello parametri e renderli tutti costanti T & anche se alcuni possono essere inseriti nei registri ....
fonte
2010-11-10 11:20:12
"efficienza" :(BACIO, passalo come passi ogni altro intero sanguinoso –
Il compilatore probabilmente lo ottimizzerà comunque –
@pst: +1 per commento divertente uomo ho riso molto duro –