คำตอบนี้ให้ภาพรวมระดับสูงที่ดีของการเพิ่มประสิทธิภาพสตริงสั้น (SSO) อย่างไรก็ตามฉันต้องการทราบรายละเอียดเพิ่มเติมว่ามันทำงานอย่างไรในทางปฏิบัติโดยเฉพาะในการใช้งาน libc ++:
สตริงต้องสั้นแค่ไหนจึงจะมีคุณสมบัติเป็น SSO สิ่งนี้ขึ้นอยู่กับสถาปัตยกรรมเป้าหมายหรือไม่?
การใช้งานแยกความแตกต่างระหว่างสตริงแบบสั้นและแบบยาวเมื่อเข้าถึงข้อมูลสตริงอย่างไร มันง่ายเหมือน
m_size <= 16
หรือเป็นแฟล็กที่เป็นส่วนหนึ่งของตัวแปรสมาชิกอื่น ๆ หรือไม่? (ฉันคิดว่าm_size
หรือบางส่วนอาจใช้ในการจัดเก็บข้อมูลสตริง)
ผมถามคำถามนี้มาโดยเฉพาะสำหรับ libc ++ เพราะฉันรู้ว่ามันใช้ SSO นี้ถูกกล่าวถึงแม้ในlibc ++ หน้าแรก
นี่คือข้อสังเกตบางประการหลังจากดูที่มา :
libc ++ สามารถคอมไพล์โดยมีเลย์เอาต์หน่วยความจำที่แตกต่างกันเล็กน้อยสำหรับคลาสสตริงซึ่งถูกควบคุมโดย_LIBCPP_ALTERNATE_STRING_LAYOUT
แฟล็ก เค้าโครงทั้งสองยังแยกความแตกต่างระหว่างเครื่องจักรเล็ก ๆ น้อย ๆ และเครื่องใหญ่เอนด์เซียนซึ่งทำให้เรามีรูปแบบต่างๆทั้งหมด 4 แบบ ฉันจะถือว่าเค้าโครง "ปกติ" และ endian น้อยในสิ่งต่อไปนี้
สมมติว่าต่อไปsize_type
คือ 4 ไบต์และนั่นvalue_type
คือ 1 ไบต์นี่คือลักษณะของสตริง 4 ไบต์แรกในหน่วยความจำ:
// 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
เนื่องจากขนาดของสตริงสั้นอยู่ใน 7 บิตด้านบนจึงจำเป็นต้องเลื่อนเมื่อเข้าถึง:
size_type __get_short_size() const {
return __r_.first().__s.__size_ >> 1;
}
ในทำนองเดียวกัน getter และ setter สำหรับความจุของสตริงแบบยาวใช้__long_mask
เพื่อแก้ไขis_long
บิต
ฉันยังคงมองหาคำตอบสำหรับคำถามแรกของฉันคือค่าอะไร__min_cap
ความสามารถของสตริงสั้นใช้สำหรับสถาปัตยกรรมที่แตกต่างกัน?
การใช้งานไลบรารีมาตรฐานอื่น ๆ
คำตอบนี้ให้ภาพรวมที่ดีของstd::string
เค้าโครงหน่วยความจำในการใช้งานไลบรารีมาตรฐานอื่น ๆ
string
ส่วนหัวได้ที่นี่ฉันกำลังตรวจสอบอยู่ในขณะนี้ :)