Jawaban ini memberikan ikhtisar tingkat tinggi yang bagus tentang pengoptimalan string pendek (SSO). Namun, saya ingin mengetahui lebih detail cara kerjanya dalam praktik, khususnya dalam implementasi libc ++:
Seberapa pendek string harus agar memenuhi syarat untuk SSO? Apakah ini bergantung pada arsitektur target?
Bagaimana implementasi membedakan antara string pendek dan panjang saat mengakses data string? Apakah itu sesederhana
m_size <= 16
atau itu sebuah bendera yang merupakan bagian dari variabel anggota lainnya? (Saya membayangkan itum_size
atau sebagian darinya mungkin juga digunakan untuk menyimpan data string).
Saya menanyakan pertanyaan ini khusus untuk libc ++ karena saya tahu bahwa ini menggunakan SSO, ini bahkan disebutkan di beranda libc ++ .
Berikut beberapa pengamatan setelah melihat sumbernya :
libc ++ bisa dikompilasi dengan dua layout memori yang sedikit berbeda untuk kelas string, ini diatur oleh _LIBCPP_ALTERNATE_STRING_LAYOUT
flag. Kedua tata letak juga membedakan antara mesin little-endian dan big-endian yang membuat kita memiliki total 4 varian berbeda. Saya akan menganggap tata letak "normal" dan little-endian sebagai berikut.
Dengan asumsi lebih lanjut itu size_type
adalah 4 byte dan itu value_type
adalah 1 byte, seperti inilah 4 byte pertama dari sebuah string akan terlihat di memori:
// 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
Karena ukuran string pendek berada di atas 7 bit, maka perlu digeser saat mengaksesnya:
size_type __get_short_size() const {
return __r_.first().__s.__size_ >> 1;
}
Demikian pula, pengambil dan penyetel untuk kapasitas string panjang digunakan __long_mask
untuk mengatasi is_long
bit.
Saya masih mencari jawaban untuk pertanyaan pertama saya, yaitu nilai apa yang akan __min_cap
diambil, kapasitas string pendek, untuk arsitektur yang berbeda?
Implementasi perpustakaan standar lainnya
Jawaban ini memberikan gambaran bagus tentang std::string
tata letak memori dalam implementasi pustaka standar lainnya.
string
headernya di sini , saya sedang memeriksanya saat ini :)