¿Existe un caso en el que la referencia pasajera es más costosa que el valor pasaje en C++? Si es así, ¿cuál sería ese caso?Pase por referencia más caro que pase por el valor
Respuesta
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 decall_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.
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.
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.
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.
"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). –
- 1. VB6 pase por valor y pase por referencia
- 2. Objetivo C - Pase por valor y pase por referencia
- 3. lPass por valor & Pase por referencia
- 4. pase por referencia C++
- 5. pase por RCPP vs. referencia por el valor
- 6. Pase por referencia en C
- 7. shared_ptr - paso por valor vs pase por referencia
- 8. C Programación - Pase por referencia
- 9. pase de Java por referencia
- 10. Pase por valor vs Pase por rendimiento de referencia C# .net
- 11. C++ 0x plantilla variable pase por referencia
- 12. Pase por referencia: ¿Cuál es más legible/correcto?
- 13. C++ Pase por Const Referencia y devolución por Const Referencia
- 14. Puntero C++ (Pase por referencia) Pregunta
- 15. Pase de estructura por referencia en C
- 16. pase el valor por referencia en el constructor, guárdelo, luego modifíquelo más tarde, ¿cómo?
- 17. El pase de PowerShell por referencia no funciona para mí
- 18. C++ Pase el puntero por referencia y asigne el valor predeterminado
- 19. Pase una matriz a una función por valor
- 20. R, copias profundas y superficiales, pase por referencia
- 21. C++ pase un mapa por referencia a la función
- 22. Pase por referencia a través de funciones múltiples
- 23. Django admin: pase la variable por URL
- 24. ¿Evita que se pase el valor del botón 'enviar' por GET?
- 25. Cómo informar a xjc que no pase por xs: importación?
- 26. ¿Por qué C# no admite la sobrecarga del operador con pase por referencia?
- 27. referencia pase a la matriz en C++
- 28. parámetro pase por el rubí en los carriles link_to
- 29. Pase el ciclo por los elementos de una matriz
- 30. varargs (va_start va_list) no funciona con el parámetro pase por referencia
Entonces, ¿cómo puede uno saber si su compilador está optimizando esto? – Arthur
Al mirar el código binario –