Mục đích của bất kỳ và tất cả các loại đề xuất "tham chiếu chuỗi" và "tham chiếu mảng" là để tránh sao chép dữ liệu đã được sở hữu ở một nơi khác và trong đó chỉ có một chế độ xem không đột biến. Câu string_view
hỏi trong là một đề xuất như vậy; có những cái trước đó được gọi string_ref
và array_ref
, quá.
Ý tưởng là luôn lưu trữ một cặp phần tử con trỏ đến đầu tiên và kích thước của một số mảng hoặc chuỗi dữ liệu hiện có .
Một lớp xử lý khung nhìn như vậy có thể được chuyển qua giá rẻ và sẽ cung cấp các hoạt động nền tảng giá rẻ (có thể được thực hiện dưới dạng tăng con trỏ đơn giản và điều chỉnh kích thước).
Nhiều cách sử dụng chuỗi không yêu cầu sở hữu chuỗi thực sự và chuỗi được đề cập thường sẽ được sở hữu bởi người khác. Vì vậy, có một tiềm năng thực sự để tăng hiệu quả bằng cách tránh các bản sao không cần thiết (nghĩ về tất cả các phân bổ và ngoại lệ bạn có thể lưu).
Các chuỗi C ban đầu đang gặp phải vấn đề là bộ kết thúc null là một phần của API chuỗi và vì vậy bạn không thể dễ dàng tạo các chuỗi con mà không làm thay đổi chuỗi bên dưới (a la strtok
). Trong C ++, điều này dễ dàng được giải quyết bằng cách lưu trữ độ dài riêng biệt và gói con trỏ và kích thước vào một lớp.
Một trở ngại và sự khác biệt lớn từ triết lý thư viện tiêu chuẩn C ++ mà tôi có thể nghĩ đến là các lớp "xem tham chiếu" như vậy có ngữ nghĩa sở hữu hoàn toàn khác với phần còn lại của thư viện chuẩn. Về cơ bản, mọi thứ khác trong thư viện chuẩn đều an toàn và chính xác vô điều kiện (nếu nó biên dịch, nó chính xác). Với các lớp tham chiếu như thế này, điều đó không còn đúng nữa. Tính chính xác của chương trình của bạn phụ thuộc vào mã môi trường sử dụng các lớp này. Vì vậy, khó kiểm tra và dạy hơn.