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 <= 16atau itu sebuah bendera yang merupakan bagian dari variabel anggota lainnya? (Saya membayangkan itum_sizeatau 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_LAYOUTflag. 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_typeadalah 4 byte dan itu value_typeadalah 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_maskuntuk mengatasi is_longbit.
Saya masih mencari jawaban untuk pertanyaan pertama saya, yaitu nilai apa yang akan __min_capdiambil, kapasitas string pendek, untuk arsitektur yang berbeda?
Implementasi perpustakaan standar lainnya
Jawaban ini memberikan gambaran bagus tentang std::stringtata letak memori dalam implementasi pustaka standar lainnya.
stringheadernya di sini , saya sedang memeriksanya saat ini :)