Tôi đang sử dụng một thư viện nội bộ được thiết kế để bắt chước thư viện C ++ được đề xuất và đôi khi trong vài năm qua tôi thấy giao diện của nó thay đổi từ sử dụng std::string
sang string_view
.
Vì vậy, tôi mạnh dạn thay đổi mã của mình, để phù hợp với giao diện mới. Thật không may, những gì tôi phải truyền vào là một tham số std :: string và một cái gì đó là giá trị trả về std :: string. Vì vậy, mã của tôi đã thay đổi từ một cái gì đó như thế này:
void one_time_setup(const std::string & p1, int p2) {
api_class api;
api.setup (p1, special_number_to_string(p2));
}
đến
void one_time_setup(const std::string & p1, int p2) {
api_class api;
const std::string p2_storage(special_number_to_string(p2));
api.setup (string_view(&p1[0], p1.size()), string_view(&p2_storage[0], p2_storage.size()));
}
Tôi thực sự không thấy những thay đổi này đã mua cho tôi với tư cách là ứng dụng khách API, ngoài nhiều mã hơn (để có thể làm hỏng). Cuộc gọi API kém an toàn hơn (do API không còn sở hữu bộ nhớ cho các tham số của nó), có thể đã lưu chương trình 0 của tôi (do trình biên dịch tối ưu hóa di chuyển có thể thực hiện ngay bây giờ) và ngay cả khi nó đã lưu công việc, điều đó chỉ có thể một vài phân bổ sẽ không và sẽ không bao giờ được thực hiện sau khi khởi động hoặc trong một vòng lặp lớn ở đâu đó. Không dành cho API này.
Tuy nhiên, cách tiếp cận này dường như làm theo lời khuyên tôi thấy ở nơi khác, ví dụ câu trả lời này :
Bên cạnh đó, vì C ++ 17, bạn nên tránh truyền const std :: string & có lợi cho std :: string_view:
Tôi thấy lời khuyên đó đáng ngạc nhiên, vì dường như nó đang ủng hộ việc thay thế một đối tượng tương đối an toàn bằng một vật thể kém an toàn hơn (về cơ bản là một con trỏ và chiều dài được tôn vinh), chủ yếu cho mục đích tối ưu hóa.
Vì vậy, khi nào nên sử dụng string_view, và khi nào thì không?
<string>
tiêu đề và tự động xảy ra. Mã đó là lừa dối và sai.
std::string_view
tạo trực tiếp, bạn chỉ cần truyền các chuỗi cho phương thức lấystd::string_view
trực tiếp và nó sẽ tự động chuyển đổi.