J'écris une application intégrée. Dans certains endroits, j'utilise beaucoup std :: ostringstream, car c'est très pratique pour mes besoins. Cependant, je viens de découvrir que le coup de performance est extrême car l'ajout de données dans le flux entraîne de nombreux appels à malloc et gratuit. Y a-t-il un moyen de l'éviter? Ma première pensée était de rendre l'ostringstream statique et de le réinitialiser en utilisant ostringstream :: set (""). Cependant, cela ne peut pas être fait car j'ai besoin que les fonctions soient réentrantes.Existe-t-il un moyen de réduire ostringstream malloc/free?
Répondre
Eh bien, Booger solution serait de passer à sprintf()
. C'est dangereux et sujet aux erreurs, mais c'est souvent plus rapide.
Pas toujours bien. Nous ne pouvons pas l'utiliser (ou ostringstream) sur mon travail en temps réel après l'initialisation car les deux effectuent des allocations de mémoire et des désallocations. Notre façon de contourner le problème est de passer à travers un grand nombre de cerceaux pour nous assurer que nous effectuons toutes les conversions de chaînes au démarrage (lorsque nous ne devons pas encore être en temps réel). Je pense qu'il y a eu une situation où nous avons écrit notre propre convertisseur dans un tableau alloué par pile de taille fixe. Nous avons des contraintes de taille sur lesquelles nous pouvons compter pour les conversions spécifiques en question. Pour une solution plus générale, vous pouvez envisager d'écrire votre propre version d'ostringstream qui utilise un tampon de taille fixe (avec un contrôle d'erreur sur les limites qui restent, bien sûr). Ce serait un peu de travail, mais si vous avez un lot de ces opérations de flux, il pourrait en valoir la peine.
Qu'est-ce que vous utilisez à la place? –
J'ai commencé à ajouter cela, mais reculé. Je vais aller de l'avant et le mettre pour vous. –
Vous pouvez au moins utiliser snprintf (avec un tampon de pile), mais je ne le préconiserais pas, à moins que le profilage ne prouve qu'il offre les avantages dont vous avez besoin et que vous décidiez que les inconvénients en valent la peine. –
Si vous connaissez la taille des données avant de créer le flux, vous pouvez utiliser ostrstream dont le constructeur peut prendre un buffer en paramètre. Ainsi, il n'y aura pas de gestion de la mémoire des données.
Probablement la manière approuvée de traiter ceci serait de créer votre propre objet basic_stringbuf
à utiliser avec votre ostringstream
. Pour cela, vous avez plusieurs choix. Un serait d'utiliser un tampon de taille fixe, et ont overflow
échouer simplement lorsque/si vous essayez de créer une sortie qui est trop longue. Une autre possibilité serait d'utiliser un vecteur comme tampon. Contrairement à std :: string, le vecteur garantit que les données ajoutées auront une complexité constante amortie. Il ne libère jamais non plus de données à partir du tampon, sauf si vous le forcez à le faire, de sorte qu'il va normalement atteindre la taille maximale avec laquelle vous traitez. À partir de ce moment, il ne doit pas allouer ou libérer de la mémoire sauf si vous créez une chaîne dont la longueur est actuellement supérieure à la longueur disponible.
J'ai vérifié la source de l'implémentation STL que j'utilise, si je la passe une chaîne au constructeur ostringstream elle fait juste une copie de cette chaîne ... –
Oui, je m'y attendais. Je vous conseille de créer votre propre objet stringbuf et de lui attacher un flux. –
Si vous voulez passer un tampon en cours d'utilisation ostrstream pas ostringstream – Mark
std::ostringsteam
est une interface de commodité. Il relie un std::string
à un std::ostream
en fournissant un std::streambuf
personnalisé. Vous pouvez implémenter votre propre std :: streambuf. Cela vous permet de faire toute la gestion de la mémoire. Vous obtenez toujours la bonne mise en forme de std::ostream
, mais vous avez un contrôle total sur la gestion de la mémoire. Bien sûr, la conséquence est que vous obtenez votre sortie formatée dans un char[]
- mais ce n'est probablement pas un gros problème si vous êtes un développeur intégré.
Ce tutoriel a été utile pour implémenter un std personnalisé: streambuf http://www.mr-edd.co .uk/blog/beginners_guide_streambuf –
- 1. ostringstream et se termine
- 2. macro Inline ostringstream rechargées
- 3. std :: ostringstream malheurs
- 4. Existe-t-il un moyen de réduire cela davantage?
- 5. Comportement standard de tellp sur vide ostringstream
- 6. Existe-t-il un moyen de réduire la précision scipy/numpy pour réduire la consommation de mémoire?
- 7. Sortie intégrée à ostringstream comme binaire?
- 8. problème ostringstream avec int en C++
- 9. Existe-t-il un moyen facile de réduire le nombre de couleurs dans un IndexedColorModel?
- 10. Existe-t-il un meilleur moyen de réduire un DateTime à une précision spécifique?
- 11. Un moyen de réduire le temps d'ajout dynamique de lignes et de colonnes à TablelayoutPanel?
- 12. Existe-t-il un moyen de réduire la verbosité de l'utilisation de String.Format (...., p1, p2, p3)?
- 13. Annuler Un WinForm Réduire?
- 14. mongoDB carte/réduire moins réduire
- 15. Existe-t-il un moyen de réduire la taille de l'application xbap?
- 16. Un moyen de réduire les définitions de valeur/fonction (F #) dans Visual Studio 2008?
- 17. Quel est un bon moyen de réduire l'interface graphique d'un site Web ASP.NET?
- 18. Existe-t-il un moyen de réduire les frais généraux associés aux appels COM externes?
- 19. Existe-t-il un moyen de réduire la bande passante prise par WCF?
- 20. Existe-t-il un moyen de réduire par programme une fenêtre?
- 21. comment tronquer la largeur des types entiers avec std :: ostringstream?
- 22. Comment faire pour réduire un expander
- 23. En utilisant __int64 et std :: ostringstream dans VC6
- 24. Comment résoudre un changement/réduire les conflits?
- 25. possible de réduire le contenu de l'iframe?
- 26. Y at-il un moyen de réduire le temps de démarrage de Android Emulator fourni avec android SDK
- 27. C++ STL dans VS2008: std :: ostringstream lance std :: bad_alloc après un usage lourd assign/clear
- 28. pourquoi ostringstream ne pouvait pas fonctionner correctement dans un environnement multithread
- 29. .NET Réduire au bac ET Réduire les ressources requises
- 30. Comment réduire un tableau en Perl?
Dupe http://stackoverflow.com/questions/1941064/should-i-preallocate-stdstringstream –
Hmm ... la question de dupe ne donne cependant pas une réponse valide. –
En outre, le "dupe" pré-suppose une réponse. – MSalters