2009-12-11 14 views
18

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

+0

¿Por qué? Es decir, ¿qué esperas lograr con este conocimiento? – wallyk

+0

posible duplicar: http://stackoverflow.com/questions/1567138/const-t-arg-vs-t-arg –

+0

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. –

Respuesta

30

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)

+5

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). –

+4

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. –

+0

¿Cómo es eso? – GManNickG

2

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.

Cuestiones relacionadas