Tôi có một dự án mà tôi cần đọc/ghi các tệp lớn.Hành vi cụ thể của std :: string on studio visual?
Tôi đã quyết định sử dụng ifstream :: read() để đưa các tệp đó vào bộ nhớ trong một lần truyền, thành chuỗi std ::. (mà dường như là cách nhanh nhất để làm điều đó trong C++: http://insanecoding.blogspot.com/2011/11/how-to-read-in-file-in-c.html và http://insanecoding.blogspot.com/2011/11/reading-in-entire-file-at-once-in-c.html)
Khi chuyển đổi giữa các file, sau đó tôi cần phải "thiết lập lại" std :: string sử dụng làm bộ nhớ đệm trước đó (ví dụ, xóa char [] đệm vào bộ nhớ miễn phí)
tôi đã cố gắng:
std::string::clear()
std::string::assign("")
std::string::erase(0, std::string::npos)
std::string::resize(0)
std::string::reserve(0)
nhưng, dưới Visual Studio 2008, điều này không giải phóng bộ nhớ sử dụng bên trong std :: string bản thân: đệm cơ bản của nó không được phân bổ. Cách duy nhất tôi tìm thấy để xóa nó là gọi std :: string :: swap (std :: string ("")) để buộc thay đổi bộ đệm bên trong giữa chuỗi std :: thực tế và chuỗi trống trong param.
Tôi thấy hành vi này một chút lạ ...
tôi chỉ thử nghiệm trên Visual Studio 2008, tôi không biết nếu đó là một hành vi STL-tiêu chuẩn hoặc nếu đó là MSVC cụ thể.
Bạn có thể cho tôi một số đầu mối không?
Trao đổi là cách tiêu chuẩn để tạo bộ nhớ dành riêng cho bản phát hành vùng chứa. Và đọc tập tin bằng cách sử dụng 'std :: string' là cách tắt từ cách tối ưu. –
@VladLazarenko: tiêu chuẩn và có thể nhanh nhất. – Nawaz
Tại sao ** sẽ ** bạn mong đợi bất cứ ai để deallocate bộ đệm? C++ 11 thêm 'shrink_to_fit()' rõ ràng để tạo một yêu cầu không ràng buộc cho deallocation. –