Es scheint mir, dass viele größere C ++ - Bibliotheken am Ende ihren eigenen Zeichenfolgentyp erstellen. Im Client - Code haben Sie entweder die eine aus der Bibliothek verwenden ( QString
, CString
, fbstring
usw., ich bin sicher , dass jemand ein paar nennen kann) oder hält zwischen dem Standardtyp umzuwandeln und die man die Bibliothek verwendet (die meisten Zeit beinhaltet mindestens eine Kopie).
Gibt es also ein bestimmtes Missfeature oder etwas Falsches std::string
(so wie die auto_ptr
Semantik schlecht war)? Hat sich das in C ++ 11 geändert?
java.lang.String
(mangelnde Überladung von Operatoren usw.) die Verwendung anderer Funktionen zu einem Problem machen würde.Antworten:
Die meisten dieser größeren C ++ - Bibliotheken wurden gestartet, bevor sie
std::string
standardisiert wurden. Andere enthalten zusätzliche Funktionen, die erst spät oder noch nicht standardisiert wurden, wie die Unterstützung von UTF-8 und die Konvertierung zwischen Codierungen.Wenn diese Bibliotheken heute implementiert würden, würden sie wahrscheinlich Funktionen und Iteratoren schreiben, die auf
std::string
Instanzen ausgeführt werden.quelle
char
garantiert groß genug, um jeden UTF-8-Codepunkt aufzunehmen. AFAIK, das ist die einzige "Unterstützung", die C ++ 98 bietet.wchar_t
es nicht groß genug ist, um alle Unicode-Codepunkte darzustellen. Darüber hinaus wurde die gesamte Diskussion über UTF-16 als schädlich eingestuft, wobei das sehr zwingende Argument lautete, dass UTF-8 ausschließlich verwendet werden sollte …String ist C ++ peinlich.
In den ersten 15 Jahren stellen Sie überhaupt keine Zeichenfolgenklasse bereit, sodass jeder Compiler auf jeder Plattform und jeder Benutzer seine eigenen erstellen muss.
Dann machen Sie etwas, das verwirrt darüber ist, ob es sich um eine vollständige Zeichenfolgenmanipulations-API oder nur um einen STL-Zeichencontainer handelt, mit einigen Algorithmen, die die auf einem std :: Vector duplizieren oder sich unterscheiden.
Wenn eine offensichtliche Zeichenfolgeoperation wie replace () oder mid () eine solche Unordnung von Iteratoren enthält, dass Sie ein neues Schlüsselwort 'auto' eingeben müssen, damit die Anweisung auf einer einzigen Seite angezeigt wird und die meisten Benutzer die gesamte Sprache aufgeben .
Und dann haben Sie Unicode-Unterstützung und std :: wstring, das ist nur arghh .....
<rant off> danke - mir geht es jetzt viel besser.
quelle
std::string
. Das Fehlen einer String-Klasse im Jahr 1983 rechtfertigt es nicht, jetzt mehr davon zu haben.Eigentlich gibt es einige Probleme mit
std::string
C ++ 11, und ja, es wird ein bisschen besser, aber lassen Sie uns nicht weiterkommen.QString
undCString
sind Teil alter Bibliotheken, daher existierten sie vor der Standardisierung von C ++ (ähnlich der SGI STL). Es handelt sich also hatte eine Klasse zu erstellen.fbstring
sehr spezifische Leistungsbedenken ansprechen. Der Standard schreibt eine Schnittstelle vor, und die Komplexität der Algorithmen garantiert Mindestanforderungen. Es ist jedoch eine Frage der Implementierungsqualität, ob diese schnell sind oder nicht.fbstring
hat spezifische Optimierungen (speicherbezogene oder eine schnellerefind
zum Beispiel).Andere Bedenken, die hier nicht erwähnt wurden (en vrac):
std::string
Codierung ist nicht bekannt und es gibt keinen speziellen Code für UTF-8. Es ist einfach, eine UTF-8-Zeichenfolge darin zu speichern und sie versehentlich zu beschädigenstd::string
Die Schnittstelle ist aufgebläht , viele Methoden könnten als freie Funktionen implementiert worden sein, und viele werden dupliziert, um sowohl einer indexbasierten als auch einer iteratorbasierten Schnittstelle zu entsprechen.quelle
c_str()
ein Zeiger auf zusammenhängenden Speicher zurückgegeben wird, was für eine gewisse C-Interoperabilität sorgt. Sie können die Daten, auf die verwiesen wird, jedoch nicht ändern. Typische Problemumgehungen umfassen die Verwendung von avector<char>
.&s[0]
können, spielt es keine Rolle mehr :)&s[0]
darf nicht auf einen NUL-terminierten String zeigen (es sei denn, erc_str()
wurde seit der letzten Änderung aufgerufen).c_str()
Msgstr " Rückgabe: Einp
solcher Zeigerp + i == &operator[](i)
für jedeni
Eingang[0,size()]
".Abgesehen von den hier genannten Gründen gibt es noch eine andere - die binäre Kompatibilität . Die Autoren der Bibliotheken haben keine Kontrolle darüber, welche
std::string
Implementierung Sie verwenden und ob sie das gleiche Speicherlayout wie ihre haben.std::string
Ist eine Vorlage, so wird ihre Implementierung von Ihren lokalen STL-Headern übernommen. Stellen Sie sich nun vor, Sie verwenden lokal eine leistungsoptimierte STL-Version, die vollständig mit dem Standard kompatibel ist. Beispielsweise haben Sie sich möglicherweise dafür entschieden, statischen Puffer in jeden einzufügenstd::string
, um die Anzahl der dynamischen Zuweisungen und Cache- Fehler zu verringern. Infolgedessen unterscheidet sich das Speicherlayout und / oder die Größe Ihrer Implementierung von denen der Bibliothek.Wenn sich nur das Layout unterscheidet, schlagen einige
std::string
Memberfunktionsaufrufe für Instanzen, die von der Bibliothek an den Client übergeben wurden, möglicherweise fehl, je nachdem, welche Member verschoben wurden.Wenn auch die Größe unterschiedlich ist,
std::string
scheinen alle Bibliothekstypen, die ein Mitglied haben, eine unterschiedliche Größe zu haben, wenn sie in der Bibliothek und im Client-Code markiert sind. Bei Datenmitgliedern, die dem Mitglied folgen,std::string
werden die Offsets ebenfalls verschoben, und jeder vom Client aufgerufene Direktzugriffs- / Inline-Accessor gibt den Müll zurück, obwohl beim Debuggen der Bibliothek "OK" angezeigt wird.Fazit: Wenn die Bibliothek und der Client-Code in verschiedenen
std::string
Versionen kompiliert werden, sind die Verknüpfungen in Ordnung. Dies kann jedoch zu bösen, schwer verständlichen Fehlern führen. Wenn Sie Ihrestd::string
Implementierung ändern , müssen alle Bibliotheken, die Mitglieder aus STL verfügbar machen, neu kompiliert werden, um demstd::string
Layout des Clients zu entsprechen . Und weil Programmierer möchten, dass ihre Bibliotheken robust sind, werden Sie sie seltenstd::string
irgendwo sichtbar sehen.Um fair zu sein, gilt dies für alle STL-Typen. IIRC haben sie nicht standardisiertes Speicherlayout.
quelle
Es gibt viele Antworten auf die Frage, aber hier sind einige:
Erbe. Viele String-Bibliotheken und -Klassen wurden VOR der Existenz von std :: string geschrieben.
Zur Kompatibilität mit Code in C. Die Bibliothek std :: string ist C ++, da es andere String-Bibliotheken gibt, die mit C und C ++ arbeiten.
Um dynamische Zuordnungen zu vermeiden. Die Bibliothek std :: string verwendet eine dynamische Zuordnung und ist möglicherweise nicht für eingebettete Systeme, Interrupt- oder Echtzeit-Code oder für Funktionen auf niedriger Ebene geeignet.
Vorlagen. Die Bibliothek std :: string basiert auf Vorlagen. Bis vor kurzem hatten einige C ++ - Compiler eine mangelhafte oder sogar fehlerhafte Vorlagenunterstützung. Leider arbeite ich in einer Branche, in der viele benutzerdefinierte Tools verwendet werden und eine unserer Toolchains von einem großen Unternehmen der Branche C ++ nicht "offiziell" unterstützt (wobei fehlerhafte Inhalte Vorlagen sind).
Es gibt wahrscheinlich noch viele weitere Gründe.
quelle
Es geht hauptsächlich um Unicode. Die Standardunterstützung für Unicode ist bestenfalls miserabel, und jeder hat seine eigenen Unicode-Anforderungen. Zum Beispiel unterstützt die ICU jede Unicode-Funktionalität, die Sie sich jemals wünschen könnten, hinter der ekelhaftesten automatisch aus Java generierten Oberfläche, die Sie sich vorstellen können eine gute Zeit.
Darüber hinaus benötigen viele Benutzer unterschiedliche Unicode-Unterstützungsebenen - nicht alle benötigen die APIs für das komplexe Textlayout und dergleichen. Es ist also leicht zu verstehen, warum es zahlreiche String-Klassen gibt - die Standard-Klasse ist ziemlich schlecht und jeder hat andere Bedürfnisse als die neuen. Niemand schafft es, eine einzige Klasse zu erstellen, die viele plattformübergreifende Unicode-Unterstützungen mit einer ansprechenden Oberfläche ausführt.
Meiner Meinung nach ist dies hauptsächlich die Schuld des C ++ - Komitees, Unicode 1998 oder 2003 nicht richtig unterstützt zu haben, vielleicht war es verständlich, aber nicht in C ++ 11. Hoffentlich werden sie es in C ++ 17 besser machen.
quelle
Das liegt daran, dass jeder Programmierer etwas zu beweisen hat und das Bedürfnis verspürt, für seine eine, großartige Funktion eine eigene großartige, schnellere String-Klasse zu erstellen. Es ist normalerweise ein wenig überflüssig und führt meiner Erfahrung nach zu allen Arten von zusätzlichen String-Konvertierungen.
quelle