Tôi muốn đọc một tệp vào một chuỗi. Tôi đang tìm những cách khác nhau để làm thế nào để làm điều đó một cách hiệu quả.Cách sử dụng istream với các chuỗi
Sử dụng một kích thước cố định * char buffer
Tôi đã nhận được một answer từ Tony những gì tạo ra một 16 kb đệm và đọc vào bộ đệm đó và gắn thêm bộ đệm cho đến khi không có gì hơn để đọc được. Tôi hiểu nó hoạt động như thế nào và tôi thấy nó rất nhanh. Những gì tôi không hiểu là trong các ý kiến của câu trả lời đó người ta nói rằng cách này sao chép tất cả mọi thứ hai lần. Nhưng khi tôi hiểu nó, nó chỉ xảy ra trong bộ nhớ, không phải từ đĩa, vì vậy nó gần như không đáng kể. Nó là một vấn đề mà nó sao chép từ bộ đệm vào chuỗi trong bộ nhớ?
Sử dụng istreambuf_iterator
Các other answer tôi đã nhận được sử dụng istreambuf_iterator. Mã trông đẹp và tối thiểu, nhưng nó rất chậm. Tôi không biết tại sao nó lại xảy ra. Tại sao những người lặp lại chậm như vậy?
Sử dụng memcpy()
Đối this question tôi đã nhận được ý kiến mà tôi nên sử dụng memcpy() vì nó là phương pháp tự nhiên nhanh nhất. Nhưng làm thế nào tôi có thể sử dụng memcpy() với một chuỗi và một đối tượng ifstream? Không phải ifstream phải làm việc với chức năng đọc riêng của nó? Tại sao sử dụng memcpy() làm hỏng tính di động? Tôi đang tìm một giải pháp tương thích với VS2010 cũng như GCC. Tại sao memcpy() không làm việc với chúng?
+ Bất kỳ cách hiệu quả nào khác có thể?
Bạn đề xuất gì, tôi sử dụng vỏ gì cho các tệp nhị phân nhỏ < 10 MB?
(Tôi không muốn chia câu hỏi này trong phần, như tôi quan tâm nhiều hơn trong việc so sánh giữa các cách khác nhau như thế nào tôi có thể đọc một ifstream thành một chuỗi)
memcpy() chú thích dùng để chỉ đọc bằng cách sử dụng tệp ánh xạ bộ nhớ, không đọc bằng istream. Tệp ánh xạ bộ nhớ không thể di chuyển được vì nó phụ thuộc vào API OS. – Dikei
Khi bạn đo lường hiệu suất, bạn có đang thực hiện nó trong chế độ phát hành hoặc gỡ lỗi không? Bạn có bật tối ưu hóa không? Bạn đã tắt kiểm tra vòng lặp? Theo mặc định, studio trực quan có kiểm tra vòng lặp tiêu chuẩn bổ sung có thể làm giảm hiệu suất. – luke
có thể trùng lặp của [cách phân bổ bộ nhớ trước cho một đối tượng chuỗi std ::] (http://stackoverflow.com/questions/3303527/how-to-pre-allocate-memory-for-a-stdstring-object/ 3304059 # 3304059)? Có lẽ bản sao chính xác nhất mà tôi từng thấy. Toàn bộ câu đầu tiên hầu như giống hệt nhau (khác biệt duy nhất là "Tôi cần ..." và "Tôi muốn ...") –