10
votes

Support pour const_string dans STD :: Ostream Operator <<

Je suis actuellement en train d'utiliser le package très intelligent boost :: const_string jusqu'à ce que http://libcxx.llvm.org/ est disponible pré-emballé sur Ubuntu ou GCC faire son __Versa_string (dans l'en-tête ext / vstring.h ) sa mise en œuvre de chaîne par défaut. STD :: String ASWELL AS __ VERSA_STRING Utilise l'optimisation de la chaîne (SSO) par défaut. Prise en charge par défaut pour la sortie d'un std :: ostream manque cependant. Le code xxx

ne fonctionne pas à moins que nous forcions x dans une chaîne C via c_str () qui devient < Pré> xxx

qui compile et fonctionne comme prévu. J'ai ajouté la ligne suivante à const_string.hpp xxx

ceci devrait améliorer les performances sur x.c_str () parce que < Code> Taille () est déjà connu et n'a pas besoin d'être calculé en recherchant null comme dans c_str () . Je travaille pour moi mais je suis incertain si cela fonctionne tous les cas. Ai-je manqué quelque chose?


2 commentaires

Cela dépend de quel comportement que vous souhaitez pour des caractères non imprimables (en particulier \ 0 ), je suppose. Je pense (!) Le comportement par défaut des chaînes normales est de tronquer après des caractères nuls. Votre mise en œuvre ne le fera probablement pas. Au fait, +1 pour me faire prendre conscience de boost :: const_string .


Je pense que c'est une sorte de compromis. Pour autant que je sache, votre code ne reflète pas les paramètres de manipulateur comme std :: setw . Si vous n'utilisez pas ces manipulateurs pour const_string , je pense que votre code a son propre usage.


3 Réponses :


2
votes

Il semble que cela puisse avoir des conséquences basées sur les paramètres régionaux et / ou des facettes appliquées au flux de chaînes vs qui écrivent les données droites comme vous le faites.

Ce serait moins performant, mais qu'en est-il de créer une STD :: String de la const_string et en utilisant <<< / code> pour insérer cela dans le flux?


1 commentaires

Merci pour vos commentaires. Comment puis-je prendre en charge les paramètres locaux alors?



1
votes

Non (vous n'avez rien oublié, Afaik). Si votre objectif est de ne pas copier sur le contenu, str.data () est la voie à suivre.


0 commentaires

3
votes

ai-je manqué quelque chose?

Oui, il suffit d'inclure const_string / io.hpp . Tout ce qui est cependant: xxx


2 commentaires

Est-ce aussi rapide que mon alternative?


@ Nordlöw: très probable, par exemple Il construit un basic_string - mais encore une fois, vous n'avez pas à gérer les local et al. Quoi qu'il en soit, je le mesurerais si cela compte vraiment dans votre demande.