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 <= 16
oder ist es ein Flag, das Teil einer anderen Mitgliedsvariablen ist? (Ich stelle mir vor, dassm_size
oder 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_LAYOUT
Flag 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_type
4 Bytes und value_type
1 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_cap
die Kapazität von kurzen Strings für verschiedene Architekturen haben?
Andere Standardbibliotheksimplementierungen
Diese Antwort gibt einen schönen Überblick über std::string
Speicherlayouts in anderen Standardbibliotheksimplementierungen.
string
Header hier finden , ich überprüfe es im Moment :)