Me pregunto si la cadena C++ se considera lo suficientemente pequeña como para ser más eficiente cuando se pasa por valor que por referencia.Pasar cadenas de C++ por valor o por referencia
Respuesta
No. Pass que por referencia:
void foo(const std::string& pString);
En general, pasar cosas por referencia si tienen un no trivial constructor de copia, de lo contrario por valor.
Una cadena generalmente consta de un puntero a datos y un contador de longitud. Puede contener más o menos, ya que su implementación está definida, pero es muy poco probable que su implementación solo use un puntero.
En el código de la plantilla, también puede usar const T&
, ya que la definición de la función estará disponible para el compilador. Esto significa que puede decidir si debe ser una referencia o no para usted. (Creo)
Su heurística no funciona para 'double' y' long double' (que normalmente es mejor si se pasa por valor). Además, para las funciones de un solo argumento, normalmente es mejor pasar 2 UDT de palabras de máquina por valor, ya que los registros se usarán para almacenar ambas partes (y guardar una indirección adicional). –
Además, 'sizeof (T)' es una medida muy pobre en general solo porque no mide el tamaño real de los datos que se copiarán. 'string' es un ejemplo particularmente bueno de eso, ya que' sizeof (string) 'típicamente será' sizeof (void *) 'en una implementación ingenua (un simple puntero a datos), o dos o tres palabras en optimización de cadenas cortas implementación. Sin embargo, al copiar una cadena, su constructor de copia copiará los datos a los que apunta, que no se contabilizan. Lo mismo ocurre con 'vector', y muchos otros. –
¿Cómo es eso? – GManNickG
Definitivamente no. A menos que su implementación particular tenga semántica de copiado-escritura (rara en estos días debido a problemas de subprocesamiento), toda la cadena debe copiarse cuando se pasa por valor (incluso si los datos de cadena reales se almacenan en el montón). Incluso si el objeto de cadena en sí mismo es solo un par de punteros internos, la cantidad de datos que se copiarán es lineal en la longitud de la cadena.
- 1. Pasar objetos por referencia o valor en C#
- 2. C++/CLI: ¿Por qué no puedo pasar cadenas por referencia?
- 3. C++ 64 bit int: pasar por referencia o pasar por valor
- 4. plantilla pasar por valor o referencia const o ...?
- 5. Ámbito de funciones/variables (¿pasar por valor o referencia?)
- 6. Pasar tipos de referencia por valor en C#
- 7. Php pasado por valor o por referencia
- 8. Propiedades: por valor o referencia?
- 9. ¿Es mejor pasar por valor o por referencia para los tipos de datos básicos?
- 10. Pasar por valor en C#
- 11. ¿Por qué pasar un objeto por valor en C++
- 12. ¿Se pasan los objetos ColdFusion por referencia o por valor?
- 13. Pasando objeto funtor por valor vs por referencia (C++)
- 14. Delphi paso de parámetros por referencia o por valor/copia
- 15. C# Pasar una propiedad por referencia
- 16. hacer las declaraciones catch catch predeterminadas en C++ pasar por valor o referencia
- 17. Procesamiento de datos por referencia o por valor en python
- 18. C++ catch blocks: captura la excepción por valor o referencia?
- 19. Bash - Pasar argumentos por referencia
- 20. Pasar una matriz por referencia
- 21. Problema al pasar por referencia
- 22. Cómo devolver punteros inteligentes (shared_ptr), por referencia o por valor?
- 23. Javascript por referencia vs. por valor
- 24. ¿Las variables PHP se pasan por valor o por referencia?
- 25. Pasando argumentos por valor o por referencia en el objetivo C
- 26. En C++, ¿es malo pasar un const bool por referencia?
- 27. 'pasar parámetro por referencia' en Ruby?
- 28. ¿Por qué pasar por referencia const en lugar de por valor?
- 29. Pasar argumentos de matriz por referencia
- 30. Alternativas para pasar clave y valor por referencia:
¿Por qué? Es decir, ¿qué esperas lograr con este conocimiento? – wallyk
posible duplicar: http://stackoverflow.com/questions/1567138/const-t-arg-vs-t-arg –
Aunque se trata de viajes en el tiempo, diría que ahora debería marcarse como un duplicado de [Son los días de pasar const std :: string & como parámetro más?] (https://stackoverflow.com/questions/10231349/are-the-days-of-passing-const-stdstring-as-a-parameter-over), que es la discusión canónica de esta pregunta en términos de C++ moderno. –