Pregunta

¿Hay algún caso en el que pase por referencia sea más costoso que el paso por valor en C ++? Si es así, ¿cuál sería ese caso?

¿Fue útil?

Solución

Prefiere pasar tipos primitivos (int, char, float, ...) y las estructuras de POD que son baratas de copiar (punto, complejos) por valor.

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

Ver Rasgos de llamadas de Boost.

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

Otros consejos

Puedes leer este artículo "¿Quieres velocidad? Pasar por valor" Acerca de la elisión de copia y RVO (retorno por optimización del valor). Explica que las referencias a veces evitan que el compilador las haga.

Sí, acceder a un argumento aprobado por referencia podría requerir más niveles de indirección que un argumento de valor aprobado por valor. Además, puede ser 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 asume que el compilador no lo está optimizando.

El compilador podría optimizar el paso de un tipo primitivo por referencia para simplemente pasar por valor, si el tipo es del mismo tamaño o menor que el tamaño de una referencia/puntero. No hay garantía de que el compilador haga esto, por lo que si tiene una opción, pase los tipos primitivos por valor. Sin embargo, en código plantado, a menudo debe pasar por referencia de todos modos: considere el back_back de Vector que toma una referencia constante. Si tiene un vector de INTS, estaría pasando una referencia a un tipo primitivo. En esa situación, esperaría que el compilador optimice eso al sustituir la referencia con un valor. Sin embargo, dado que el vector podría estar almacenando tipos grandes, aceptar una referencia constante es la mejor opción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top