Je suis curieux de savoir comment les std::string est mis en œuvre et comment est-il différent de chaîne c?Si la norme ne précise pas la mise en œuvre puis de toute mise en œuvre avec l'explication serait génial avec la façon dont elle répond à l'exigence d'une chaîne donnée par la norme?
Réponses
Trop de publicités?Pratiquement chaque compilateur, j'ai utilisé fournit le code source de l'exécution, de sorte que vous êtes en utilisant GCC ou MSVC ou que ce soit, vous avez la capacité de regarder à la mise en œuvre. Cependant, une grande partie ou la totalité des std::string
seront mis en œuvre dans le code du modèle, ce qui peut le rendre très difficile la lecture.
Scott Meyer livre, Efficace STL, a un chapitre sur les std::string implémentations c'est un aperçu correct de la commune de variations: "Article 15: Être conscient de variations en string
des implémentations".
Il parle de 4 variantes:
plusieurs variations sur un ref-compté mise en œuvre (communément connu comme la copie sur écriture) - lorsqu'une chaîne de caractères de l'objet est copié inchangé, le refcount est incrémenté, mais la chaîne de données n'est pas. À la fois objet de point à la même refcounted de données jusqu'à ce que l'un des objets les modifie, causant ainsi une "copie sur écriture" des données. Les variations sont dans où les choses comme le refcount, serrures, etc sont stockés.
un "court optimisation de la chaîne" (SSO) de la mise en œuvre. Dans cette variante, l'objet contient l'habitude pointeur vers les données, la longueur, la taille du tampon allouée dynamiquement, etc. Mais si la chaîne est assez court, il va utiliser cette zone pour stocker la chaîne, au lieu d'allouer dynamiquement un tampon
Aussi, Herb Sutter est "de plus en Plus Exceptionnels C++" a une annexe (l'Annexe A: "Optimisations qui ne le sont pas (dans un Multithread Monde") que l'on explique pourquoi la copie sur écriture refcounted implémentations ont souvent des problèmes de performance des applications multithread en raison de problèmes de synchronisation. Cet article est également disponible en ligne (mais je ne sais pas si c'est exactement la même chose que ce qui est dans le livre):
Ces deux chapitres serait utile de lecture.
std::string est une classe qui s'enroule autour d'une sorte de mémoire tampon interne et fournit des méthodes pour la manipulation de la mémoire tampon.
Une chaîne de caractères en C est juste un tableau de caractères
Expliquer toutes les nuances de la façon dont std::string fonctionne ici serait trop long. Peut-être regarder le code source de gcc http://gcc.gnu.org pour voir exactement comment ils le font.
Il y a un exemple de mise en œuvre dans une réponse sur cette page.
En outre, vous pouvez regarder du ccg mise en œuvre, en supposant que vous avez gcc installé. Si non, vous pouvez avoir accès à leur code source via SVN. La plupart des std::string est mis en œuvre par basic_string, donc commencer par là.
Une autre source d'info est Watcom du compilateur
Le c++ solution pour les chaînes de caractères sont très différents de la version c. La première et la plus importante différence est alors que le c à l'aide de la ASCIIZ solution, le std::string et std::wstring sont à l'aide de deux itérateurs (pointeurs) pour stocker la chaîne réelle. L'utilisation de base de la chaîne des classes fournit une dynamique alloué solution, donc dans le coût de la charge du PROCESSEUR avec la gestion dynamique de la mémoire, il rend la manipulation des chaînes plus à l'aise.
Comme vous le savez probablement déjà, le C ne contiennent pas intégré dans le générique de type chaîne de caractères, seulement fournit quelques opérations de la chaîne par le biais de la bibliothèque standard. L'une des principales différence entre le C et le C++ que le C++ fournit un enveloppé de la fonctionnalité, de sorte qu'il peut être considéré comme un faux type générique.
En C, vous devez marcher à travers la chaîne si vous voulez savoir la longueur de celui-ci, le std::string::size() de la fonction membre est une instruction (fin - début) essentiellement. Vous pouvez ajouter des chaînes de l'un à l'autre, aussi longtemps que vous avez de la mémoire, donc il n'y a pas besoin de s'inquiéter à propos du dépassement de la mémoire tampon de bugs (et donc les exploits), parce que l'ajout de crée un plus grand tampon, s'il est nécessaire.
Comme quelqu'un l'a dit avant, la chaîne est dérivé du vecteur de la fonctionnalité, dans un modélisé façon, il est donc plus facile de traiter avec le caractère multi-octets systèmes. Vous pouvez définir votre propre type de chaîne à l'aide de la typedef std::basic_string specific_str_t; expression à tout arbitraire type de données du paramètre du modèle.
Je pense qu'il y a suffisamment d'avantages et les contras des deux côtés:
Chaîne C++ Pour: - Plus vite itération dans certains cas (à l'aide de la taille certainement, et il n'est pas nécessaire les données de la mémoire pour vérifier si vous êtes à la fin de la chaîne, la comparaison de deux pointeurs. qui pourrait faire une différence avec la mise en cache) - Le tampon de l'opération sont emballés avec la chaîne de la fonctionnalité, donc moins de soucis sur les problèmes de buffer.
C++ de la chaîne de Contre: - en raison de l'allocation dynamique de la mémoire des choses, l'utilisation de base pourrait causer impact sur les performances. (heureusement, vous pouvez indiquer à l'objet de type string quelle devrait être la taille de la mémoire tampon, de sorte que si vous dépasser, de ne pas allouer les blocs dynamiques de la mémoire) - souvent bizarre et incohérent noms par rapport à d'autres langues. c'est la mauvaise chose à propos de tout stl trucs, mais vous pouvez utiliser pour elle, et il fait un peu C++spécifique à l'ish sentiment. - l'utilisation intensive de la création de modèles forces de la bibliothèque standard à utiliser l'en-tête basé sur des solutions c'est donc un grand impact sur la compilation du temps.
Qui dépend de la bibliothèque standard que vous utilisez.
STLPort , par exemple, est un Standard C++ mise en œuvre de Bibliothèque qui implémente les chaînes entre autres choses.