Komisches Verhalten von std::string?
-
Ethon schrieb:
Stell dir vor der String wäre refcounted, dann wäre die Hölle los.
Ein String kann auf sehr viele unterschiedliche Arten implementiert sein.Seit C++11 kann ein string nicht mehr refcounted sein.
-
refcounted schrieb:
Seit C++11 kann ein string nicht mehr refcounted sein.
Ich glaube, das ist Quatsch, den du nur nachplapperst.
Kannst du das denn auch belegen?
-
Ethon schrieb:
Beschreibe im asm-Code einen const char*
Höö?
-
krümelkacker schrieb:
refcounted schrieb:
Seit C++11 kann ein string nicht mehr refcounted sein.
Ich glaube, das ist Quatsch, den du nur nachplapperst.
Kannst du das denn auch belegen?21.4.1/6 schrieb:
References, pointers, and iterators referring to the elements of a basic_string sequence may be invalidated
by the following uses of that basic_string object:
— as an argument to any standard library function taking a reference to non-const basic_string as an
argument.233
— Calling non-const member functions, except operator[], at, front, back, begin, rbegin, end, and
rend.Damit std::string geshared (refcounted) sein könnte, müsste operator[] die Iteratoren ungültig machen.
-
krümelkacker schrieb:
refcounted schrieb:
Seit C++11 kann ein string nicht mehr refcounted sein.
Ich glaube, das ist Quatsch, den du nur nachplapperst.
Kannst du das denn auch belegen?Doch das ist schon richtig. In C++11 wurde geändert, was Iteratoren und Referenzen auf basic_string-Objekte ungültig macht. Der Sinn dahinter ist bessere Unterstützung für multithreaded-Zugriffe. Dadurch wird indirekt ref-counting ausgeschlossen. Die libstc++-Entwickler sind sich dieser Tatsache bewusst, aber ich weiß nicht, ob dies in der jüngsten Version schon überarbeitet ist. Jedenfalls war die Implementierung eine ganze Weile lang nicht C++11-standardkonform, da noch die alte Implementierung beibehalten wurde.
edit: Viel zu langsam.
-
Danke für das Zitat ... also streng ausgeschlossen wird das jetzt nicht, aber eine ref-counted Implementierung müsste, bevor sie überhaupt Iteratoren oder Referenzen rausgibt, dafür sorgen, dass die Zeichenkette nicht mehr mit anderen string-Objekten geteilt wird. Ob sich das dann noch lohnt ist natürlich fraglich.
Ich habe mal im aktuellen GCC Quellcode reingeschaut. Die letzte Änderung an basic_string.h war vor 5 Wochen. Allerdings scheint sich die Implementierung auf den ersten Blick noch nicht C++11-konform zu sein, da
const_iterator
en einfach so rausgegeben werden, ohne das Sharing vorher aufzuheben.
-
Mein letzter Stand (Sommer 2012, daher ist auch meine aktuelle Compilerversion, die ich jetzt nicht aktualisieren werde) ist, dass eine short-string-Optimierung unter dem Namen vstring (ext/vstring.h) enthalten ist. Genauer gesagt ist das ein ganz cleverer String, bei dem man seine Optimierung selber wählen kann. Aber jedenfalls ist die short-string-Optimierung des vstrings die Testimplementierung die später einmal (oder vielleicht auch jetzt schon in der neuesten Version, ich weiß nicht was aktuell ist) die C++11-konforme Implementierung von std::string werden soll.
-
krümelkacker schrieb:
Danke für das Zitat ... also streng ausgeschlossen wird das jetzt nicht, aber eine ref-counted Implementierung müsste, bevor sie überhaupt Iteratoren oder Referenzen rausgibt, dafür sorgen, dass die Zeichenkette nicht mehr mit anderen string-Objekten geteilt wird. Ob sich das dann noch lohnt ist natürlich fraglich.
Selbst das ist nicht möglich, denn z.B.
begin()
istnoexcept
, also darf keine Reallokation erfolgen.
-
Deswegen finde ich den fbstring aus der Facebook-Library einfach genial: https://github.com/facebook/folly/blob/master/folly/docs/FBString.md
Der kombiniert SSO, "normal" allozierte Strings und COW.
Benutze eigentlich überhaupt keinen std::string mehr bzw ich habe einen Switch in nem Header.out schrieb:
Ethon schrieb:
Beschreibe im asm-Code einen const char*
Höö?
const char* out; __asm mov edi, out std::string s(out);
-
Ok, damit hat sich das ref-counting bei basic_string wirklich erledigt. Ich bin überzeugt.
-
Ethon schrieb:
Deswegen finde ich den fbstring aus der Facebook-Library einfach genial: https://github.com/facebook/folly/blob/master/folly/docs/FBString.md
Der kombiniert SSO, "normal" allozierte Strings und COW.
Nur kann ich die "100%ige std::string-Kompatibilität" nicht glauben, da ja in C++11, wie ich gelernt habe, begin() z.B. noexcept ist. und FBString::begin ggf eine bad_alloc-Ausnahme schmeißt.
-
Die meinen bestimmt 100% kompatibel zu C++98-Strings. Aber dafür in der Praxis schneller als die üblichen Implementierungen.