Pour les littéraux de chaîne, et uniquement pour les constantes de chaîne provenant de littéraux, j'utiliserais const char[]
. L'avantage principal de std::string
est qu'il a la gestion de la mémoire gratuitement, mais ce n'est pas un problème avec les littéraux de chaîne. De toute façon, il s'agit du type réel du littéral, et il peut être directement utilisé dans n'importe quelle API qui requiert les anciennes chaînes terminées par le style C ou les chaînes C++ (conversion implicite). Vous obtenez également une implémentation de la taille du temps de compilation en utilisant le tableau au lieu du pointeur. Maintenant, lors de la définition des interfaces de fonction, et même si les constantes sont censées être transmises, je préférerais std::string
plutôt que const char*
, car dans ce dernier cas la taille est perdue, et devra éventuellement être recalculée.
De ma propre expérience. J'ai vieilli de l'écriture .c_str()
sur chaque appel à la bibliothèque de journalisation (qui utilisait des arguments variables) pour les chaînes littérales avec des messages d'info/erreur.
Et il est plus rapide dans de nombreuses implémentations STL grâce à un mécanisme de copie sur écriture si vous utilisez les mêmes chaînes dans de nombreux endroits différents, ce qui le rend également plus facile à utiliser que les chaînes C simples. A côté de cela, si vous avez besoin de supporter plusieurs langues, je préfère utiliser std :: wstring. – jdehaan
@jdehaan: Je serais surpris s'il y a (m) des implémentations de bibliothèques std (pas des implémentations STL, car 'std :: string' ne faisait pas partie de la STL) qui fait encore COW. Dans les environnements MT, cela se transforme généralement en une pessimisation. Je pense que l'optimisation des petites chaînes (les petites chaînes ne sont pas allouées sur le tas, mais sur la pile) est ce qui est généralement préféré maintenant. – sbi
La copie à l'écriture est supprimée (si elle est toujours présente) dans la plupart des implémentations. Il a des problèmes dans les environnements multithread, car certaines opérations qui semblent thread-safe du point de vue de l'utilisateur (ils se réfèrent à différentes chaînes std :: string) peuvent ne pas être thread-safe. Considérez une chaîne copiée avec chaque copie passée sur différents threads pour la modification. Chaque thread a sa propre chaîne, aucun objet partagé, mais en fait il peut y avoir une condition de concurrence dans l'implémentation interne 'copy-on-write'. L'ajout d'un mécanisme de verrouillage dans la bibliothèque le rend plus lent qu'une simple implémentation dans de nombreux cas. –