Comment std :: ssortingng est-il implémenté?

Je suis curieux de savoir comment std :: ssortingng est implémenté et en quoi diffère-t-il de c ssortingng? Si le standard ne spécifie aucune implémentation, alors toute implémentation avec explication serait géniale avec la manière dont elle répond à la condition de chaîne donnée par standard?

Pratiquement tous les compilateurs que j’ai utilisés fournissent le code source pour l’exécution – donc, que vous utilisiez GCC, MSVC ou autre, vous avez la possibilité d’examiner l’implémentation. Cependant, une grande partie ou la totalité de std::ssortingng sera implémentée en tant que code de modèle, ce qui peut rendre la lecture très difficile.

Le livre de Scott Meyer, Effective STL , contient un chapitre sur les implémentations de std :: ssortingng qui donne un aperçu correct des variantes courantes: “Point 15: Soyez conscient des variations dans ssortingng implémentations de ssortingng “.

Il parle de 4 variations:

  • plusieurs variantes sur une implémentation recomptée (communément appelée copie sur écriture) – lorsqu’un object chaîne est copié sans modification, le refcount est incrémenté mais les données de chaîne réelles ne le sont pas. Les deux objects pointent vers les mêmes données refcounted jusqu’à ce que l’un des objects le modifie, provoquant une «copie sur écriture» des données. Les variations sont là où des choses comme le refcount, les verrous etc. sont stockés.

  • une implémentation “short ssortingng optimization” (SSO). Dans cette variante, l’object contient le pointeur habituel vers les données, la longueur, la taille du tampon alloué dynamicment, etc. Mais si la chaîne est suffisamment courte, elle utilisera cette zone pour contenir la chaîne au lieu d’allouer dynamicment un tampon.

En outre, Herb Sutter “More Exceptional C ++” contient une annexe (Annexe A: “Optimisations qui ne sont pas (dans un monde multithread)”) expliquant pourquoi les implémentations refcounted copy on write rencontrent souvent des problèmes de synchronisation Cet article est également disponible en ligne (mais je ne suis pas sûr que ce soit exactement le même que dans le livre):

Ces deux chapitres mériteraient d’être lus.

std :: ssortingng est une classe qui entoure une sorte de tampon interne et fournit des méthodes pour manipuler ce tampon.

Une chaîne en C est juste un tableau de caractères

Expliquer toutes les nuances de la manière dont std :: ssortingng fonctionne ici prendrait trop de temps. Jetez un oeil au code source de gcc http://gcc.gnu.org pour voir exactement comment ils le font.

Il y a un exemple d’implémentation dans une réponse sur cette page .

De plus, vous pouvez regarder l’implémentation de gcc en supposant que gcc est installé. Sinon, vous pouvez accéder à leur code source via SVN . La plupart de std :: ssortingng est implémenté par basic_ssortingng , alors commencez par là.

Une autre source d’information possible est le compilateur de Watcom

La solution c ++ pour les chaînes est très différente de la version c. La première et la plus importante différence réside dans le fait que le c utilisant la solution ASCIIZ, le std :: ssortingng et le std :: wssortingng utilisent deux iterators (pointeurs) pour stocker la chaîne réelle. L’utilisation de base des classes de chaînes fournit une solution dynamic allouée, ce qui rend le traitement des chaînes plus confortable avec le coût de la charge du processeur avec la gestion dynamic de la mémoire.

Comme vous le savez probablement déjà, le C ne contient aucun type de chaîne générique intégré, il ne fournit que quelques opérations de chaîne via la bibliothèque standard. L’une des principales différences entre C et C ++ est que le C ++ fournit une fonctionnalité enveloppée, de sorte qu’il peut être considéré comme un type générique simulé.

En C, vous devez parcourir la chaîne si vous souhaitez en connaître la longueur. La fonction membre std :: ssortingng :: size () n’est qu’une instruction (end-begin). Vous pouvez sans problème append des chaînes l’une à l’autre tant que vous avez de la mémoire, il n’y a donc pas lieu de vous inquiéter des bogues de dépassement de tampon (et donc des exploits), car la création crée un tampon plus important si nécessaire.

Comme quelqu’un l’a déjà dit, la chaîne est dérivée de la fonctionnalité vectorielle, de manière modélisée, ce qui facilite la gestion des systèmes à plusieurs octets. Vous pouvez définir votre propre type de chaîne en utilisant le typedef std :: basic_ssortingng specific_str_t; expression avec n’importe quel type de données arbitraire dans le paramètre template.

Je pense qu’il y a suffisamment d’avantages et de inconvénients des deux côtés:

Chaîne C ++ Pros: – Itération plus rapide dans certains cas (en utilisant la taille définitivement, et il n’a pas besoin des données de la mémoire pour vérifier si vous êtes à la fin de la chaîne, en comparant deux pointeurs. Cela pourrait faire la différence avec la mise en cache) – L’opération de tampon est empaquetée avec la fonctionnalité de chaîne, donc moins de soucis concernant les problèmes de mémoire tampon.

Chaîne C ++ Inconvénients: – en raison de l’allocation dynamic de la mémoire, l’utilisation de base peut avoir un impact sur les performances. (heureusement, vous pouvez dire à l’object ssortingng quelle devrait être la taille du tampon d’origine, donc à moins de le dépasser, il n’atsortingbuera pas de blocs dynamics à la mémoire) – noms souvent étranges et incohérents par rapport aux autres langages. Ceci est la mauvaise chose à propos de tous les trucs stl, mais vous pouvez vous y habituer, et cela donne un sentiment spécifique de C ++ ish. – l’utilisation intensive du modèle oblige la bibliothèque standard à utiliser des solutions basées sur des en-têtes, ce qui a un impact important sur le temps de compilation.

Cela dépend de la bibliothèque standard que vous utilisez.

STLPort, par exemple, est une implémentation de la bibliothèque standard C ++ qui implémente entre autres des chaînes.