Gần đây tôi đã thực hiện một số tối ưu hóa cần thiết. Một điều tôi đã làm là thay đổi một số dòng chảy -> chạy nước rút. Tôi đang chạy một loạt std :: chuỗi sang mảng kiểu ac, ala
char foo[500];
sprintf(foo, "%s+%s", str1.c_str(), str2.c_str());
Hóa ra việc triển khai std :: string :: c_str () của Microsoft chạy trong thời gian không đổi (nó chỉ trả về một con trỏ bên trong). Dường như libstdc ++ cũng làm như vậy . Tôi nhận ra std không đảm bảo cho c_str, nhưng thật khó để tưởng tượng một cách khác để làm điều này. Ví dụ, nếu họ sao chép vào bộ nhớ, họ sẽ phải phân bổ bộ nhớ cho bộ đệm (để lại cho người gọi để hủy nó - KHÔNG phải là một phần của hợp đồng STL) HOẶC họ phải sao chép vào tĩnh bên trong bộ đệm (có thể không phải là chủ đề an toàn và bạn không có gì đảm bảo về tuổi thọ của nó). Vì vậy, chỉ cần trả về một con trỏ đến một chuỗi kết thúc null được duy trì bên trong dường như là giải pháp thực tế duy nhất.
c_str
là một phương thức const (hoặc ít nhất là có quá tải const - tôi quên điều đó), nhưng điều này không thay đổi giá trị logic, vì vậy có thể là một lý do chomutable
. Nó sẽ ngắt các con trỏ khỏi các lệnh gọi khácc_str
, ngoại trừ mọi con trỏ như vậy phải tham chiếu đến cùng một chuỗi logic (vì vậy không có lý do mới nào để tái phân bổ - phải có một dấu kết thúc null) hoặc nếu không thì phải có một lệnh gọi đến không phương pháp -const ở giữa.