65 votes

chaînes immuables vs std::string

Je me suis récemment renseigné sur les chaînes de caractères immuables. Pourquoi les chaînes de caractères ne peuvent-elles pas être mutables en Java et .NET ? y Pourquoi .NET String est immuable ? ainsi que des informations sur les raisons pour lesquelles D choisit des chaînes immuables. Il semble y avoir de nombreux avantages.

  • trivialement thread safe
  • plus sûr
  • plus efficace en termes de mémoire dans la plupart des cas d'utilisation.
  • des sous-chaînes bon marché (tokenizing et slicing)

Sans compter que la plupart des nouveaux langages ont des chaînes immuables, D2.0, Java, C#, Python, etc.

Le C++ bénéficierait-il de chaînes de caractères immuables ?

Est-il possible d'implémenter une classe de chaîne immuable en c++ (ou c++0x) qui aurait tous ces avantages ?


mettre à jour :

Il existe deux tentatives de chaînes de caractères immuables const_string y fix_str . Aucun des deux n'a été mis à jour depuis une demi-décennie. Sont-ils au moins utilisés ? Pourquoi const_string ne s'est jamais retrouvé dans boost ?

42 votes

Un argument très élaboré et convaincant que vous avez fait là, BlueRaja.

6 votes

Eh bien, BlueRaja n'a pas vraiment fait un argument, comme vous l'avez tous si clairement souligné. Mais il pourrait avoir raison, en ce sens que le C++ est peut-être trop un langage hybride pour que les tentatives puristes d'une chaîne de caractères immuable trouvent leur place. Cela en dit plus sur la culture C++ que sur le langage lui-même, bien sûr.

5 votes

Objection ! La chaîne de caractères de Ruby n'est pas immuable !

2voto

Mark Ransom Points 132545
const std::string

Et voilà. Une chaîne littérale est également immuable, à moins que vous ne souhaitiez adopter un comportement indéfini.

Edita: Bien sûr, ce n'est que la moitié de l'histoire. Une variable const string n'est pas utile parce que vous ne pouvez pas lui faire référencer une nouvelle chaîne. Une référence à une chaîne const ferait l'affaire, mais le C++ ne permet pas de réaffecter une référence comme dans d'autres langages tels que Python. La chose la plus proche serait un pointeur intelligent vers une chaîne allouée dynamiquement.

1voto

supercat Points 25534

Les chaînes immuables sont géniales si Ainsi, chaque fois qu'il est nécessaire de créer une nouvelle chaîne de caractères, le gestionnaire de mémoire sera toujours en mesure de déterminer l'emplacement de chaque référence de chaîne de caractères. Sur la plupart des plates-formes, le support linguistique pour une telle capacité pourrait être fourni à un coût relativement modeste, mais sur les plates-formes sans support linguistique intégré, c'est beaucoup plus difficile.

Si, par exemple, on voulait concevoir une implémentation de Pascal sur x86 qui supporte des chaînes immuables, il serait nécessaire que l'allocateur de chaînes puisse parcourir la pile pour trouver toutes les références de chaînes ; le seul coût en temps d'exécution serait d'exiger une approche cohérente des appels de fonctions [par exemple, ne pas utiliser d'appels de queue et faire en sorte que chaque fonction non feu maintienne un pointeur de cadre]. Chaque zone de mémoire allouée avec new devrait avoir un bit pour indiquer s'il contient des chaînes de caractères et ceux qui en contiennent devraient avoir un index vers un descripteur de structure de mémoire, mais ces coûts seraient assez faibles.

Si un GC n'était pas utilisé pour parcourir la pile, il faudrait alors que le code utilise des handles plutôt que des pointeurs, et que le code crée des handles de chaîne lorsque des variables locales entrent dans le scope, et détruise les handles lorsqu'elles sortent du scope. Une surcharge bien plus importante.

0voto

Martin Beckett Points 60406

Qt utilise également des chaînes immuables avec copie sur écriture.
Il y a un débat sur la question de savoir combien de performance cela vous apporte réellement avec des compilateurs décents.

0voto

FredOverflow Points 88201

Les chaînes constantes ont peu de sens avec la sémantique des valeurs, et le partage n'est pas l'une des plus grandes forces du C++...

0voto

Loki Astari Points 116129

Nous avons des chaînes de caractères immuables :

char const* const string = "Plop";

Comparons :

  • trivialement thread safe

    OUI :

  • plus sûr

    OUI : La plupart des compilateurs placent cette information dans un segment en lecture seule (vérifiez la documentation de votre compilateur pour plus de détails).

  • plus efficace en termes de mémoire dans la plupart des cas d'utilisation

    OUI :

  • des sous-chaînes bon marché (tokenizing et slicing)

    Avec un tout petit peu de travail

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X