Câu trả lời này cung cấp một cái nhìn tổng quan cấp cao về tối ưu hóa chuỗi ngắn (SSO). Tuy nhiên, tôi muốn biết chi tiết hơn cách nó hoạt động trong thực tế, cụ thể là trong việc triển khai libc ++:
Chuỗi phải ngắn đến mức nào để đủ điều kiện nhận SSO? Điều này có phụ thuộc vào kiến trúc mục tiêu không?
Làm thế nào để triển khai phân biệt giữa chuỗi ngắn và chuỗi dài khi truy cập dữ liệu chuỗi? Nó có đơn giản như
m_size <= 16
hay nó là một cờ là một phần của một số biến thành viên khác? (Tôi tưởng tượng rằngm_size
hoặc một phần của nó cũng có thể được sử dụng để lưu trữ dữ liệu chuỗi).
Tôi đã hỏi câu hỏi này đặc biệt cho libc ++ vì tôi biết rằng nó sử dụng SSO, điều này thậm chí còn được đề cập trên trang chủ libc ++ .
Dưới đây là một số nhận xét sau khi xem nguồn :
libc ++ có thể được biên dịch với hai cách bố trí bộ nhớ hơi khác nhau cho lớp chuỗi, điều này được điều chỉnh bởi _LIBCPP_ALTERNATE_STRING_LAYOUT
cờ. Cả hai cách bố trí cũng phân biệt giữa máy đời nhỏ và máy cỡ lớn, khiến chúng ta có tổng cộng 4 biến thể khác nhau. Tôi sẽ giả định bố cục "bình thường" và ít endian trong những gì sau đây.
Giả sử xa hơn đó size_type
là 4 byte và đó value_type
là 1 byte, đây là 4 byte đầu tiên của chuỗi sẽ trông như thế nào trong bộ nhớ:
// 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
Vì kích thước của chuỗi ngắn nằm trong 7 bit trên, nên nó cần được dịch chuyển khi truy cập:
size_type __get_short_size() const {
return __r_.first().__s.__size_ >> 1;
}
Tương tự, getter và setter cho khả năng của một chuỗi dài sử dụng __long_mask
để làm việc xung quanh is_long
bit.
Tôi vẫn đang tìm câu trả lời cho câu hỏi đầu tiên của mình, tức là giá trị nào __min_cap
, dung lượng của các chuỗi ngắn, sẽ lấy cho các kiến trúc khác nhau?
Các triển khai thư viện tiêu chuẩn khác
Câu trả lời này cung cấp một cái nhìn tổng quan tốt đẹp về std::string
bố cục bộ nhớ trong các triển khai thư viện tiêu chuẩn khác.
string
tiêu đề của nó ở đây , tôi đang kiểm tra nó vào lúc này :)