2010-01-21 20 views

Respuesta

15

Prefiere pasar los tipos primitivos (int, char, float, ...) y las estructuras POD que son baratas para copiar (Punto, complejo) por valor.

Esto será más eficiente que la indirección requerida al pasar por referencia.

Ver Boost's Call Traits.

la clase de plantilla call_traits<T> encapsula el método de "mejor" para pasar un parámetro de algún tipo T o de una función, y consta de una colección de typedefs definidos como en la tabla a continuación. El objetivo de call_traits es garantizar que nunca surjan problemas como "referencias a referencias" y que los parámetros se pasen de la manera más eficiente posible.

4

Sí, el acceso a un argumento pasado por referencia podría requerir más niveles de indirección que un argumento de valor pasado. Además, es posible que sea más lento si el tamaño del argumento es más pequeño que el tamaño de un solo puntero. Por supuesto, todo está asumiendo que el compilador no lo está optimizando.

+0

Entonces, ¿cómo puede uno saber si su compilador está optimizando esto? – Arthur

+2

Al mirar el código binario –

7

Puede leer este artículo "Want speed ? Pass by value" sobre copy elision y RVO (Return by Value Optimization). Explica que las referencias a veces impiden que el compilador las haga.

1

El compilador podría optimizar pasar un tipo primitivo por referencia simplemente pasando por valor, si el tipo es del mismo tamaño o más pequeño que el tamaño de una referencia/puntero. No hay garantía de que el compilador haga esto, por lo que si puede elegir, pase los tipos primitivos por valor. Sin embargo, en el código de plantilla, a menudo tiene que pasar por referencia: considere el push_back de vector que toma una referencia constante. Si tiene un vector de enteros, estaría pasando una referencia a un tipo primitivo. En esa situación, es de esperar que el compilador optimice eso sustituyendo la referencia por un valor. Sin embargo, dado que el vector podría estar almacenando tipos grandes, aceptar una referencia constante es la mejor opción.

+0

"El compilador podría optimizar ..." siempre que el destinatario no modifique la referencia, o lo lea después de llamar a cualquier código que pueda modificarlo. Pero, por supuesto, en los casos en que sí lo haga, es de esperar que no se haga la pregunta "cuál es más cara", sino "cuál es la correcta" :-) Los incómodos son casos en los que cree que el compilador puede optimizar, pero en realidad no puede porque ha pasado por alto alguna razón que debe ser una referencia (las reglas de alias son la causa principal de las sorpresas). –

Cuestiones relacionadas