Wie ist std::string implementiert?

Lesezeit: 5 Minuten

Ich bin neugierig zu wissen, wie std::string implementiert ist und wie es sich von c string unterscheidet? Wenn der Standard keine Implementierung angibt, wäre jede Implementierung mit Erklärung großartig, wie sie die vom Standard vorgegebene String-Anforderung erfüllt?

  • Vielleicht möchten Sie den Quellcode zu etwas wie gcc bringen und sehen, wie sie ihn implementieren.

    – Jakob Schwarz

    23. September 2009 um 13:42 Uhr

  • Siehe auch: stackoverflow.com/questions/3170295/…

    Benutzer649198

    15. November 2012 um 23:03 Uhr

Benutzer-Avatar
Michael Burr

Praktisch jeder Compiler, den ich verwendet habe, stellt Quellcode für die Laufzeit bereit – ob Sie also GCC oder MSVC oder was auch immer verwenden, Sie haben die Möglichkeit, sich die Implementierung anzusehen. Allerdings ein großer Teil oder alle std::string wird als Vorlagencode implementiert, was das Lesen sehr erschweren kann.

Scott Meyers Buch Effective STL enthält ein Kapitel über std::string-Implementierungen, das einen anständigen Überblick über die gängigen Variationen gibt: „Item 15: Seien Sie sich bewusst von Variationen in string Implementierungen“.

Er spricht von 4 Variationen:

  • mehrere Variationen einer ref-counted-Implementierung (allgemein bekannt als copy on write) – wenn ein String-Objekt unverändert kopiert wird, wird der refcount inkrementiert, die eigentlichen String-Daten jedoch nicht. Beide Objekte zeigen auf die gleichen neu gezählten Daten, bis eines der Objekte sie modifiziert, was eine “Kopie beim Schreiben” der Daten verursacht. Die Variationen bestehen darin, wo Dinge wie Refcount, Sperren usw. gespeichert werden.

  • eine “Short-String-Optimierung” (SSO)-Implementierung. In dieser Variante enthält das Objekt den üblichen Zeiger auf Daten, Länge, Größe des dynamisch zugewiesenen Puffers usw. Aber wenn die Zeichenfolge kurz genug ist, wird es diesen Bereich verwenden, um die Zeichenfolge zu halten, anstatt dynamisch einen Puffer zuzuweisen

Außerdem enthält Herb Sutters „More Exceptional C++“ einen Anhang (Appendix A: „Optimizations that are’t (in a Multithreaded World)“), in dem erläutert wird, warum Copy-on-Write-Refcount-Implementierungen aufgrund von Synchronisationsproblemen häufig Leistungsprobleme in Multithread-Anwendungen haben. Dieser Artikel ist auch online verfügbar (aber ich bin mir nicht sicher, ob er genau mit dem übereinstimmt, was im Buch steht):

Beide Kapitel wären lesenswert.

  • Hinweis (seitdem von einer kürzlich gestellten Frage verlinkt): Interessanterweise ist die Copy-on-Write-Implementierung von GCC besser als die Short-String-Optimierung von VC++ Bewegung Situationen, weil Bewegung Der Betrieb ist in erster Linie davon betroffen sizeof ein Objekt.

    – Matthias M.

    13. März 2012 um 7:56 Uhr

  • “Short String Optimization” wird offenbar oft mit “SSO” abgekürzt: stackoverflow.com/questions/10315041/meaning-of-acronym-sso

    – Raedwald

    25. April 2012 um 13:33 Uhr

  • Ich stimme zu, dass die Bücher von Scott Meyers und Herb Sutter großartige allgemeine Informationen über String-Implementierungen enthalten, aber sie sagen nicht genau, welche Implementierungen welche Optimierungen (oder Nicht-Optimierungen) verwenden. Wer das wissen will, hier ein Vergleich: http://info.prelert.com/blog/cpp-stdstring-implementations

    – dmr195

    14. September 2015 um 16:06 Uhr


  • gcc-Implementierung ist hier: gcc.gnu.org/onlinedocs/gcc-4.8.1/libstdc++/api/…

    – Yiannis Mpourkelis

    4. Dezember 2015 um 11:05 Uhr


std::string ist eine Klasse, die eine Art internen Puffer umschließt und Methoden zur Bearbeitung dieses Puffers bereitstellt.

Ein String in C ist nur ein Array von Zeichen

Es würde zu lange dauern, hier alle Nuancen der Funktionsweise von std::string zu erklären. Vielleicht mal in den gcc-Quellcode schauen http://gcc.gnu.org um genau zu sehen, wie sie es tun.

Benutzer-Avatar
DVK

Es gibt eine Beispielimplementierung in eine Antwort auf dieser Seite.

Außerdem können Sie sich die Implementierung von gcc ansehen, vorausgesetzt, Sie haben gcc installiert. Wenn nicht, können Sie über SVN auf ihren Quellcode zugreifen. Der größte Teil von std::string wird von implementiert basic_stringalso fange dort an.

Eine weitere mögliche Informationsquelle ist Watcoms Compiler

Die C++-Lösung für Zeichenfolgen unterscheidet sich stark von der C-Version. Der erste und wichtigste Unterschied besteht darin, dass std::string und std::wstring zwei Iteratoren (Zeiger) verwenden, um die eigentliche Zeichenfolge zu speichern, während c die ASCIIZ-Lösung verwendet. Die grundlegende Verwendung der String-Klassen bietet eine dynamisch zugewiesene Lösung, so dass die Kosten für den CPU-Overhead mit der dynamischen Speicherbehandlung die String-Behandlung komfortabler machen.

Wie Sie wahrscheinlich bereits wissen, enthält C keinen eingebauten generischen Zeichenfolgentyp, sondern bietet nur einige Zeichenfolgenoperationen über die Standardbibliothek. Einer der Hauptunterschiede zwischen C und C++ besteht darin, dass C++ eine umschlossene Funktionalität bietet, sodass es als gefälschter generischer Typ betrachtet werden kann.

In C müssen Sie durch den String gehen, wenn Sie dessen Länge wissen möchten, die Member-Funktion std::string::size() ist im Grunde nur eine Anweisung (end – begin). Sie können Zeichenfolgen sicher aneinander anhängen, solange Sie über Speicher verfügen, sodass Sie sich keine Gedanken über die Pufferüberlauffehler (und damit die Exploits) machen müssen, da das Anhängen bei Bedarf einen größeren Puffer erzeugt.

Wie hier schon einmal gesagt wurde, wird die Zeichenkette von der Vektorfunktionalität auf Schablonenbasis abgeleitet, so dass es einfacher ist, mit den Multibyte-Zeichensystemen umzugehen. Sie können Ihren eigenen String-Typ mit der Typedef std::basic_string specific_str_t; Ausdruck mit einem beliebigen Datentyp im Vorlagenparameter.

Ich denke, es gibt genug Vor- und Nachteile auf beiden Seiten:

Vorteile von C++-Strings: – Schnellere Iteration in bestimmten Fällen (mit definitiver Verwendung der Größe, und es werden keine Daten aus dem Speicher benötigt, um zu prüfen, ob Sie am Ende des Strings sind und zwei Zeiger vergleichen. Das könnte einen Unterschied machen mit dem Caching) – Die Pufferoperation ist mit der String-Funktionalität ausgestattet, sodass Sie sich weniger Sorgen um die Pufferprobleme machen müssen.

Nachteile von C++-Strings: – Aufgrund der dynamischen Speicherzuweisung kann die grundlegende Verwendung Auswirkungen auf die Leistung haben. (Glücklicherweise können Sie dem String-Objekt mitteilen, wie groß die ursprüngliche Puffergröße sein sollte. Wenn Sie diese also nicht überschreiten, werden keine dynamischen Blöcke aus dem Speicher zugewiesen) – im Vergleich zu anderen Sprachen oft seltsame und inkonsistente Namen. Das ist das Schlechte an jedem STL-Zeug, aber Sie können sich daran gewöhnen, und es erzeugt ein etwas spezifisches C++-Gefühl. – Die starke Nutzung des Templating zwingt die Standardbibliothek, Header-basierte Lösungen zu verwenden, was einen großen Einfluss auf die Kompilierzeit hat.

Das hängt von der verwendeten Standardbibliothek ab.

STLPort zum Beispiel ist eine Implementierung der C++-Standardbibliothek, die unter anderem Zeichenfolgen implementiert.

1013330cookie-checkWie ist std::string implementiert?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy