Pregunta

Estoy escribiendo una aplicación embebida. En algunos lugares, yo uso std :: ostringstream mucho, ya que es muy conveniente para mis propósitos. Sin embargo, acabo de descubrir que el impacto en el rendimiento es extrema desde la adición de datos a los resultados de flujo en una gran cantidad de llamadas a malloc y libre. ¿Hay alguna manera de evitarlo?

Lo primero que pensé estaba haciendo la estática ostringstream y reiniciarlo usando ostringstream :: set ( ""). Sin embargo, esto no se puede hacer, ya que necesito las funciones que deben reentrada.

¿Fue útil?

Solución

Bueno, solución Booger 's sería cambiar a sprintf(). Es inseguro y propenso a errores, pero a menudo es más rápido.

No siempre sin embargo. No podemos utilizarlo (o ostringstream) en mi trabajo en tiempo real después de la inicialización porque ambos realizar asignaciones de memoria y cancelaciones de asignación.

Nuestra solución al problema es que pasar por una gran cantidad de aros para asegurarse de que llevamos a cabo todas las conversiones de series en el arranque (cuando no tenemos que ser real en tiempo aún). Creo que había una situación en la que escribimos nuestro propio convertidor en una matriz de pila-asignado de tamaño fijo. Tenemos algunas limitaciones en el tamaño que podemos contar para las conversiones específicas en cuestión.

Para una solución más general, es posible que no hacer su propia versión de ostringstream que utiliza un buffer de tamaño fijo (con comprobación de errores en los límites que se mantuvo dentro, por supuesto). Sería un poco de trabajo, pero si usted tiene un montón de esas operaciones de secuencias que podría valer la pena.

Otros consejos

Si sabe lo grande que los datos son antes de crear la corriente se puede utilizar ostrstream cuyo constructor puede tener un buffer como un parámetro. Por lo tanto no habrá gestión de memoria de los datos.

Probablemente la forma aprobada de tratar con esta sería la creación de su propio objeto basic_stringbuf para usar con su ostringstream. Por eso, usted tiene un par de opciones. Una de ellas sería usar un tampón de tamaño fijo, y tienen overflow simplemente fallar cuando / si se intenta crear una salida que es demasiado larga. Otra posibilidad sería el uso de un vector como el tampón. A diferencia std :: string, garantiza que los datos vectoriales anexas tendrán complejidad constante amortizado. También nunca se libera de datos de la memoria intermedia a menos que fuerce a, por lo que normalmente va a crecer hasta el tamaño máximo que se está tratando. A partir de ese punto, no debería asignar o liberar memoria a menos que cree una cadena que está más allá de la longitud que tiene actualmente disponibles.

std::ostringsteam es una interfaz de conveniencia. Se une un std::string a un std::ostream proporcionando un std::streambuf personalizado. Se puede implementar su propio std :: streambuf. Eso le permite hacer toda la gestión de memoria. Todavía conseguir el buen formateo de std::ostream, pero usted tiene el control total sobre la gestión de memoria. Por supuesto, la consecuencia es que se llega a su salida con formato en un char[] - pero eso es probablemente no es un gran problema si usted es un desarrollador incrustado

.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top