2015-12-08 14 views
10

Trong C++98C++03std::string có thể đã lưu trữ dữ liệu nằm trong bộ nhớ không tiếp giáp. Lý do cho việc này là gì? Điều gì có thể tối ưu hóa có thể đạt được bằng yêu cầu thoải mái này? Đã làm bất kỳ trình biên dịch/kiến ​​trúc thực sự làm cho việc sử dụng này?Lợi ích của std :: chuỗi không lưu trữ dữ liệu ở vị trí bộ nhớ liền kề (trước C++ 11)

Nếu bạn có các phần của chuỗi được lưu trữ ở các vị trí bộ nhớ khác nhau, thì trình vòng lặp có quá phức tạp không? Và cả lớp nữa, vì nó sẽ cần phải biết chính xác vị trí của các phần khác nhau của chuỗi.

+0

Không có lý do gì khiến trình vòng lặp quá phức tạp. Nó có thể được thực hiện như 'cặp ', với 'toán tử *' lập chỉ mục chuỗi, 'toán tử ++' tăng chỉ mục, và cứ thế. Tất nhiên, lớp học sẽ phải biết các phần khác nhau ở đâu, nhưng điều đó có thể rất hiệu quả nếu được lưu trữ trong một cây cân bằng. Xem [dây] (https://en.wikipedia.org/wiki/Rope_ (data_structure)). – user4815162342

+0

Đây là một chuyên gia/con khác cho việc thực hiện dây (mà - như tôi hiểu - tiêu chuẩn có trong tâm trí như một cái gì đó mà có thể được): http://www.sgi.com/tech/stl/Rope.html – peterchen

Trả lời

10

Lý do chính là việc ghép nối chuỗi có thể diễn ra mà không cần phân bổ lại. Tôi tin rằng các phiên bản đầu tiên của STLPort đã khai thác điều này.

Một lý do khác là có thể thực hiện sao chép trên ghi hoặc thậm chí sao chép một phần. Mặc dù các yêu cầu khác yêu cầu của std::string (đặc biệt là ngữ nghĩa di chuyển của C++ 11) bây giờ có nghĩa là điều này không còn có thể.

+0

wouldn ' t iterator sẽ quá phức tạp? Ngoài ra lớp học sẽ phức tạp vì bạn sẽ cần phải biết chính xác nơi các phần của chuỗi của bạn. – bolov

+0

Nếu không suy nghĩ quá nhiều, tôi đã nghĩ rằng việc lặp lại phức tạp hơn một chút so với việc truyền tải đơn giản cho các phần liền kề cùng với một thành ngữ kiểu danh sách liên kết. – Bathsheba

+0

@bolov: trình lặp lại sau: thật đáng buồn. Iterator sẽ chứa tham chiếu đến phân khúc và phần bù vào phân khúc. Nếu các phân đoạn được giữ trong danh sách được liên kết kép hoặc bất kỳ thứ gì có thể lặp lại theo chiều hai chiều thì đó là "một bổ sung' if' "*. – peterchen

Các vấn đề liên quan