Ci sono due considerazioni principali. Uno è la spesa per copiare l'oggetto passato e il secondo è l'ipotesi che il compilatore può fare quando l'oggetto è un oggetto locale.
E.g. Nel primo modulo, nel corpo di f
non si può presumere che a
e non facciano riferimento allo stesso oggetto; quindi il valore di a
deve essere riletto dopo ogni scrittura su b
, per ogni evenienza. Nel secondo modulo, a
non può essere modificato tramite una scrittura su b
, poiché è locale per la funzione, quindi queste rilette non sono necessarie.
void f(const Obj& a, Obj& b)
{
// a and b could reference the same object
}
void f(Obj a, Obj& b)
{
// a is local, b cannot be a reference to a
}
E.g.: Nel primo esempio, il compilatore può essere in grado di assumere che il valore di un oggetto locale non cambia quando viene effettuata una chiamata non correlata. Senza informazioni su h
, il compilatore potrebbe non sapere se un oggetto a cui quella funzione ha un riferimento (tramite un parametro di riferimento) non viene modificato da h
. Ad esempio, quell'oggetto potrebbe essere parte di uno stato globale che viene modificato da h
.
void g(const Obj& a)
{
// ...
h(); // the value of a might change
// ...
}
void g(Obj a)
{
// ...
h(); // the value of a is unlikely to change
// ...
}
Sfortunatamente, questo esempio non è in ghisa. È possibile scrivere una classe che, ad esempio, aggiunge un puntatore a se stesso a un oggetto di stato globale nel suo costruttore, in modo che anche un oggetto locale di tipo classe possa essere modificato da una chiamata di funzione globale. Nonostante ciò, ci sono ancora potenzialmente maggiori opportunità di ottimizzazioni valide per gli oggetti locali in quanto non possono essere alias direttamente direttamente dai riferimenti passati o da altri oggetti preesistenti.
Il passaggio di un parametro tramite const
deve essere scelto dove la semantica dei riferimenti è effettivamente richiesta o come miglioramento delle prestazioni solo se il costo del potenziale aliasing viene superato dalla spesa per la copia del parametro.
fonte
2010-04-06 06:01:09
possibile duplicato di http://stackoverflow.com/questions/1567138/const-t-arg-vs-t-arg –
L'articolo gf links copre la tua seconda domanda. In breve: se avete bisogno di una copia, passatene una. –
@ Kirill Ah, questo risponde alla mia domanda. Ho cercato "pass by const reference" e non ha attivato nulla, quindi ho perso quello. – Maulrus