¿Cómo funciona el stringstream internamente?
-
27-09-2019 - |
Pregunta
Yo te pido en el contexto de rendimiento. Es stringstream simplemente una cadena / vector, por lo que escribir en él puede resultar en todo su contenido está copiando en un pedazo más grande de la memoria, o se trata de hecho de una manera más complicado (por ejemplo, una lista de cadenas o lo que sea)?
Solución
Es hasta el vendedor biblioteca estándar de cómo implementar stringstream (o alguna de las funciones de la biblioteca para el caso). Usted puede mirar en el encabezado sstream enviado con su compilador para ver cómo se implementa allí. Que tanto en el aspecto teórico ...
En cuanto a la experiencia práctica y las mediciones muestran, ostringstream es a menudo lenta en comparación con otros métodos para dar formato a los datos como cadenas de caracteres. Pero, de nuevo, solamente optimizará después de haber medido que lo que se desea optimizar es de hecho un cuello de botella, que de lo contrario sólo será una pérdida de tiempo en el mejor.
Si sus mediciones muestran que el rendimiento de ostringstream realmente es un problema para usted, considere el uso de Boost.Karma . Por supuesto que hay más razones para usar Boost.Karma que el rendimiento justo, por lo que si usted está comenzando un nuevo código en lugar de querer modificar uno utilizando flujos de cadena existente, es posible que también desee utilizar Karma desde el primer momento.
Otros consejos
27.7.3 / 1 dice que basic_ostringstream
utiliza un basic_stringbuf
. Creo que 27.7.1.3/8 dice que basic_stringbuf
hace que el espacio mediante la reasignación de un buffer, y ni siquiera garantiza un crecimiento exponencial (y por lo tanto, O amortizado (1) para agregar).
Pero encuentro la sección de la impenetrable bastante estándar arroyos, y siempre existe la regla de "como si". Así que no puedo prometer que el uso de un deque
debajo (y consolidar cuando alguien pregunta por la cadena / tampón) que realmente está prohibido.