Questa risposta offre una bella panoramica di alto livello sull'ottimizzazione delle stringhe brevi (SSO). Tuttavia, vorrei sapere più in dettaglio come funziona in pratica, in particolare nell'implementazione di libc ++:
Quanto deve essere breve la stringa per qualificarsi per SSO? Dipende dall'architettura di destinazione?
In che modo l'implementazione distingue tra stringhe brevi e lunghe quando si accede ai dati della stringa? È semplice come
m_size <= 16
o è un flag che fa parte di qualche altra variabile membro? (Immagino chem_size
o parte di esso potrebbe essere utilizzato anche per memorizzare dati di stringa).
Ho posto questa domanda specificamente per libc ++ perché so che usa SSO, questo è anche menzionato nella home page di libc ++ .
Ecco alcune osservazioni dopo aver esaminato la fonte :
libc ++ può essere compilato con due layout di memoria leggermente diversi per la classe string, questo è governato dal _LIBCPP_ALTERNATE_STRING_LAYOUT
flag. Entrambi i layout distinguono anche tra macchine little-endian e big-endian che ci lascia con un totale di 4 diverse varianti. Assumerò il layout "normale" e il little endian in quanto segue.
Supponendo inoltre che size_type
sia 4 byte e che value_type
sia 1 byte, questo è come apparirebbero i primi 4 byte di una stringa in memoria:
// 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
Poiché la dimensione della stringa breve è nei 7 bit superiori, deve essere spostata quando si accede:
size_type __get_short_size() const {
return __r_.first().__s.__size_ >> 1;
}
Allo stesso modo, il getter e il setter per la capacità di una lunga stringa utilizza __long_mask
per aggirare il is_long
bit.
Sto ancora cercando una risposta alla mia prima domanda, ovvero quale valore __min_cap
assumerebbe la capacità delle stringhe corte per architetture diverse?
Altre implementazioni di librerie standard
Questa risposta offre una bella panoramica dei std::string
layout di memoria in altre implementazioni di librerie standard.
string
intestazione qui , lo sto controllando al momento :)