2010-12-05 15 views
6

Sé que los literales de cadena en C/C++ tienen duración de almacenamiento estático, lo que significa que viven "para siempre", es decir, mientras se ejecuta el programa.C++ cadenas literales contra cadenas const

Por lo tanto, si tengo una función que se está llamando mucha frecuencia y utiliza una cadena literal de este modo:

void foo(int val) 
{ 
    std::stringstream s; 
    s << val; 
    lbl->set_label("Value: " + s.str()); 
} 

donde la función toma un set_label const std::string& como parámetro.

¿Debo utilizar aquí un const std::string en lugar de la cadena literal o no haría ninguna diferencia?

Necesito minimizar el consumo de memoria del tiempo de ejecución tanto como sea posible.

edición:

que significaba para comparar la cadena literal con un const std::string prefix("Value: "); que se inicializa en una especie de un archivo de cabecera constantes.

Además, la concatenación aquí devuelve un temporal (llamémosle Value: 42 y una referencia constante a este temporal esté siendo pasado a la función set_text(), estoy en lo cierto en esto?

Gracias de nuevo!

+0

¿Cuál es su bola mágica 8 dice? –

+0

Si desea minimizar el consumo de memoria en el tiempo de ejecución, ¿qué le parece si modifica set_label para que tome una const char * y use una char * en lugar de una cadena? – user347594

+0

@ user347594: No puedo modificar 'set_label' desafortunadamente –

Respuesta

9

Su programa opera en el mismo literal cada vez. No hay una forma más eficiente de almacenamiento. Se construiría una std :: string, se duplicaría en el montón, y luego se liberaría cada vez que se ejecutara la función, lo que sería un desperdicio total

+5

A menos que sepa qué implementación utilizan los OP, no puede saber que esto no es exactamente lo que está sucediendo de todos modos ni que las optimizaciones del compilador no harán que su declaración sea completamente falsa. –

+1

Noah tiene razón, una cadena tan pequeña como esta no puede usar almacenamiento de almacenamiento en absoluto. 'stringstream' por otro lado es muy pesado ... –

+0

@Noah: Estoy bastante seguro de que no importa cómo optimice el compilador, no se le puede ocurrir algo más eficiente que una cadena literal. – Puppy

0

¿Cómo va a construir su const std :: string? Si y Si lo haces a partir de una cadena litral, al final solo será peor (o idéntico si el compilador hace un buen trabajo). Un literal de cadena no consume mucha memoria, y también memoria estática, que puede no ser el tipo de memoria de la que está baja.

Si puede leer todos los literales de cadena, digamos un archivo, y devolver la memoria al sistema operativo cuando las cadenas ya no se utilizan, puede haber alguna forma de reducir la huella de memoria (pero probablemente ralentizará programa mucho).

Pero probablemente haya muchas otras maneras de reducir el consumo de memoria antes de hacer ese tipo de cosas.

0

Almacénelas en algún tipo de recurso y cárguelas/descárguelas según sea necesario.

2

Esto utilizará menos memoria y ejecutar mucho más rápido (snprintf utilizar si su compilador soporta):

void foo(int val) 
{ 
    char msg[32]; 
    lbl->set_label(std::string(msg, sprintf(msg, "Value: %d", val))); 
} 

Para implementaciones aún más rápidas, echa un vistazo a C++ performance challenge: integer to std::string conversion

+0

+1 para la optimización! Sin embargo, volviendo a mi pregunta original, ¿un string literal sería más productivo que usar 'const std :: string' definido en un archivo de encabezado de constantes? –

+0

@vic: realmente depende de si necesita la longitud. 'std :: string' almacena en caché la longitud, por lo que es una cuestión de poca importancia leer una variable, mientras que con un' char * 'tienes que usar' strlen', que itera. Sin embargo, el literal de cadena en sí es una matriz de caracteres que tiene su longitud como parte de la información del tipo de tiempo de compilación, que es el más rápido de todos (cuando el código se escribe para aprovecharlo). –

+0

Te perdiste un paréntesis en tu respuesta. +1 de todos modos. Me gusta la solución. – whoan