Bueno, creo que el título es bastante directo. He leído muchas veces que uno debe evitar copiar objetos pesados, y parece bastante racional (¿quién querría ser un fanático de la memoria?). La pregunta es, ¿cuándo un objeto debe considerarse pesado? ¿cuántos miembros?¿Cuándo es un objeto lo suficientemente pesado como para evitar copiar?
Respuesta
Cada vez que el objeto que está pasando es más grande que el tamaño de un puntero (normalmente 4 bytes en 32 bits, 8 bytes en 64 bits), entonces sería más eficiente evitar la copia.
Aun cuando no se debe pasarlo por referencia/puntero depende de la cantidad de trabajo extra que será, y lo que va a hacer con los datos. Si pasas por referencia solo para crear una copia y modificarla en tu función, entonces has vencido el propósito. En cualquier momento pasarlo como const by-reference es suficiente, entonces probablemente sea una buena idea hacerlo.
Sin embargo, tenga en cuenta que la mayoría de los compiladores son lo suficientemente inteligentes como para optimizar la copia de un objeto de solo lectura cuando el código se compila con optimizaciones. Así que no tiene que preocuparse realmente a menos que se convierta en un cuello de botella y pueda probarlo cuantitativamente.
Yo agregaría que es preferible pasar un puntero y, a veces, la única forma de lograr ciertos diseños, es decir. puntero a interfaces, chorros, punteros a funciones, etc. – EdChum
Pasar por referencia evita algunas optimizaciones que el compilador puede realizar en los valores, por lo que no es tan seco y cortante como eso. C++ 11 parece haber cambiado también las antiguas reglas generales, algunos aconsejan que se pase de valor en muchos lugares en los que anteriormente habías pasado por referencia constante, particularmente para objetos de valor como std :: string, debido a para mover la semántica. – ergosys
- 1. ¿La especificación # es lo suficientemente estable como para usarla?
- 2. ¿Cuándo Spring + Tomcat no es lo suficientemente potente?
- 3. ¿Cuándo Google Analytics no es lo suficientemente bueno?
- 4. Es C# lo suficientemente rápido para juegos
- 5. DevExpress para ASP.NET es lo suficientemente rápido
- 6. ¿Es Mono lo suficientemente robusto para un serio desarrollo empresarial?
- 7. ¿Contenedores clave, lo suficientemente seguros como para almacenar claves privadas?
- 8. Sphinx autodoc no es lo suficientemente automático
- 9. ¿El pistón django es lo suficientemente maduro?
- 10. ¿Mono es estable y lo suficientemente rápido?
- 11. ¿Es la MacBook lo suficientemente potente como para desarrollar Ipad? o necesito un MacBook Pro?
- 12. ¿Es SQLite lo suficientemente fuerte como para usar como base de datos de wordpress?
- 13. ¿Es Request.ServerVariables ["REMOTE_ADDR"] lo suficientemente confiable?
- 14. ¿Haskell es lo suficientemente maduro para aplicaciones web?
- 15. ¿Es lo suficientemente grande como para una tabla de registro de eventos?
- 16. ¿System.Threading.Timer es lo suficientemente eficiente para miles de temporizadores simultáneos?
- 17. ¿Es D lo suficientemente potente para estas funciones?
- 18. ¿Qué es "lo suficientemente desinfección" para una dirección URL
- 19. ¿Es SQL Server lo suficientemente inteligente como para NO ACTUALIZAR si los valores son los mismos?
- 20. ¿ASE es lo suficientemente maduro como para comenzar a desarrollar aplicaciones de Android?
- 21. ¿es la cookie de sesión lo suficientemente segura como para almacenar el ID de usuario?
- 22. php orm lo suficientemente potente?
- 23. ¿Hay un generador de números pseudoaleatorio lo suficientemente simple como para hacer en tu cabeza?
- 24. ¿El IDE Scala Eclipse es lo suficientemente estable?
- 25. ¿Cómo sé si esto es lo suficientemente aleatorio?
- 26. ¿TransportWithMessageCredential sin certificado es lo suficientemente seguro para un servicio WCF?
- 27. ¿PEAR es "pesado"?
- 28. TextView corta el texto cuando es lo suficientemente largo
- 29. ¿Por qué 'Código no es lo suficientemente genérico'?
- 30. ¿La autenticación básica con SSL es lo suficientemente segura?
Depende completamente de qué objeto es y cómo se usa. –
Si puede evitar copiar, ¿por qué no evitarlo todo el tiempo? –
@James McNellis: y la arquitectura en la que se está ejecutando. – m0skit0