Hay dos consideraciones principales. Uno es el costo de copiar el objeto pasado y el segundo son las suposiciones que el compilador puede hacer cuando el objeto es un objeto local.
E.g. En la primera forma, en el cuerpo de f
no se puede suponer que a
y b
no hacen referencia al mismo objeto; por lo que el valor de a
debe volver a leerse después de cualquier escritura en b
, por si acaso. En la segunda forma, a
no se puede cambiar mediante una escritura a b
, ya que es local para la función, por lo que estas relecturas son innecesarias.
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.: En el primer ejemplo, el compilador puede suponer que el valor de un objeto local no cambia cuando se realiza una llamada no relacionada. Sin información sobre h
, el compilador puede no saber si un objeto al que hace referencia esa función (mediante un parámetro de referencia) no se cambia por h
. Por ejemplo, ese objeto puede ser parte de un estado global que se modifica por 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
// ...
}
Desafortunadamente, este ejemplo no es de hierro fundido. Es posible escribir una clase que, por ejemplo, se agregue un puntero a un objeto de estado global en su constructor, de modo que incluso un objeto local del tipo de clase podría ser alterado por una llamada a función global. A pesar de esto, todavía hay más oportunidades para optimizaciones válidas para objetos locales ya que no pueden ser alias directamente por referencias pasadas u otros objetos preexistentes.
Al pasar un parámetro por const
se debe elegir la referencia donde realmente se requiere la semántica de las referencias, o como una mejora del rendimiento solo si el costo del aliasing potencial se compensa por el costo de copiar el parámetro.
posible duplicado de http://stackoverflow.com/questions/1567138/const-t-arg-vs-t-arg –
Los enlaces del artículo gf cubren su segunda pregunta. En resumen: si necesita una copia, pase una. –
@Kirill Ah, eso responde mi pregunta. Busqué "pass by const reference" y no subió nada, así que me perdí esa. – Maulrus