Diese Antwort gibt einen schönen Überblick über die Short String Optimization (SSO). Ich möchte jedoch genauer wissen, wie es in der Praxis funktioniert, insbesondere in der libc ++ - Implementierung:
Wie kurz muss die Zeichenfolge sein, um sich für SSO zu qualifizieren? Hängt dies von der Zielarchitektur ab?
Wie unterscheidet die Implementierung beim Zugriff auf die Zeichenfolgendaten zwischen kurzen und langen Zeichenfolgen? Ist es so einfach wie
m_size <= 16oder ist es ein Flag, das Teil einer anderen Mitgliedsvariablen ist? (Ich stelle mir vor, dassm_sizeoder ein Teil davon auch zum Speichern von Zeichenfolgendaten verwendet werden könnte).
Ich habe diese Frage speziell für libc ++ gestellt, weil ich weiß, dass SSO verwendet wird. Dies wird sogar auf der libc ++ - Homepage erwähnt .
Hier sind einige Beobachtungen nach dem Betrachten der Quelle :
libc ++ kann mit zwei leicht unterschiedlichen Speicherlayouts für die Zeichenfolgenklasse kompiliert werden. Dies wird durch das _LIBCPP_ALTERNATE_STRING_LAYOUTFlag gesteuert . Beide Layouts unterscheiden auch zwischen Little-Endian- und Big-Endian-Maschinen, sodass wir insgesamt 4 verschiedene Varianten haben. Ich werde im Folgenden das "normale" Layout und Little-Endian annehmen.
Unter der Annahme, dass dies size_type4 Bytes und value_type1 Byte sind, würden die ersten 4 Bytes eines Strings im Speicher folgendermaßen aussehen:
// short string: (s)ize and 3 bytes of char (d)ata
sssssss0;dddddddd;dddddddd;dddddddd
^- is_long = 0
// long string: (c)apacity
ccccccc1;cccccccc;cccccccc;cccccccc
^- is_long = 1
Da die Größe der kurzen Zeichenfolge in den oberen 7 Bits liegt, muss sie beim Zugriff verschoben werden:
size_type __get_short_size() const {
return __r_.first().__s.__size_ >> 1;
}
In ähnlicher Weise verwendet der Getter und Setter für die Kapazität eines langen Strings __long_mask, um das zu umgehenis_long Bit zu umgehen.
Ich suche immer noch nach einer Antwort auf meine erste Frage, dh welchen Wert würde __min_capdie Kapazität von kurzen Strings für verschiedene Architekturen haben?
Andere Standardbibliotheksimplementierungen
Diese Antwort gibt einen schönen Überblick über std::stringSpeicherlayouts in anderen Standardbibliotheksimplementierungen.
stringHeader hier finden , ich überprüfe es im Moment :)