2010-10-31 37 views
5

Pregunto en el contexto del rendimiento. ¿El stringstream es simplemente una cadena/vector, por lo que escribir en él puede hacer que todo su contenido se copie en un trozo más grande de memoria, o se hace de una manera más complicada (por ejemplo, una lista de cadenas o lo que sea)?¿Cómo funciona stringstream internamente?

Respuesta

3

Depende del proveedor de la biblioteca estándar cómo implementar el flujo de cadenas (o cualquier característica de la biblioteca). Puede ver el encabezado sstream incluido con su compilador para ver cómo se implementa allí. Eso en el aspecto teórico ...

En cuanto a la experiencia práctica y las mediciones muestran, ostringstream es a menudo lento en comparación con otros métodos para formatear datos como cadenas de caracteres. Pero, de nuevo, solo optimice una vez que haya medido que lo que desea optimizar es, de hecho, un cuello de botella de rendimiento, de lo contrario, será una pérdida de tiempo en el mejor de los casos.

Si sus medidas muestran que el rendimiento de ostringstream es realmente un problema para usted, considere usar Boost.Karma. Por supuesto, hay más razones para usar Boost.Karma que solo el rendimiento, por lo que si está comenzando un nuevo código en lugar de querer modificar uno existente utilizando cadenas de transmisión, es posible que desee utilizar Karma desde el principio.

+0

Si bien las implementaciones varían, la norma sí hace requisitos generales de rendimiento en muchos casos. Creo que eso es lo que el OP está preguntando. –

+0

@Roger Pate: seguro que hay requisitos de complejidad en el estándar, pero no recuerdo ninguno que impida la implementación de ostringstream utilizando un solo búfer contiguo o varios búferes de tamaño fijo. De hecho, yo personalmente no recuerdo ninguna especificación de complejidad para las funciones estándar de transmisión de E/S. ¿Vos si? – usta

4

27.7.3/1 dice que basic_ostringstream usa un basic_stringbuf. Creo que 27.7.1.3/8 dice que basic_stringbuf hace espacio reasignando un buffer, y ni siquiera garantiza el crecimiento exponencial (y por lo tanto amortiza O (1) para anexar).

Pero encuentro que la sección de transmisiones del estándar es bastante impenetrable, y siempre existe la regla "como si". Así que no puedo prometerle que usar un deque debajo (y consolidar cuando alguien pregunta por el string/buffer) está realmente prohibido.

+0

basic_stringbuf no tiene que almacenar su memoria en un formato contiguo, por lo tanto, cuando su búfer está lleno, no será necesario reasignar (es decir, mover la memoria original) pero puede hacer que funcione un poco como std :: deque. Como STL es de código abierto, puede ver cómo un proveedor en particular implementa basic_stringbuf. – CashCow