2010-10-31 36 views
5

Tôi hỏi trong bối cảnh hiệu suất. Stringstream có đơn giản là một chuỗi/vectơ không, vì vậy việc ghi vào nó có thể dẫn đến toàn bộ nội dung của nó được sao chép vào một bộ nhớ lớn hơn, hoặc nó được thực hiện theo cách phức tạp hơn (ví dụ, một danh sách các chuỗi hay bất kỳ thứ gì)?Stringstream hoạt động như thế nào?

Trả lời

3

Đó là tùy thuộc vào nhà cung cấp thư viện chuẩn cách triển khai chuỗi (hoặc bất kỳ tính năng thư viện nào cho vấn đề đó). Bạn có thể xem tiêu đề sstream được gửi kèm với trình biên dịch của bạn để xem nó được triển khai ở đó như thế nào. Điều đó nhiều ở phía lý thuyết ...

Theo kinh nghiệm thực tế và các phép đo cho thấy, ostringstream thường chậm so với các phương pháp khác để định dạng dữ liệu dưới dạng chuỗi ký tự. Nhưng sau đó một lần nữa, chỉ tối ưu hóa sau khi bạn đã đo lường rằng những gì bạn muốn tối ưu hóa thực sự là một nút cổ chai hiệu suất, nếu không đó sẽ chỉ là một sự lãng phí thời gian tốt nhất.

Nếu số đo của bạn cho thấy hiệu suất của ostringstream thực sự là một vấn đề đối với bạn, hãy cân nhắc sử dụng Boost.Karma. Tất nhiên có nhiều lý do để sử dụng Boost.Karma hơn là chỉ hiệu suất, vì vậy nếu bạn đang bắt đầu một mã mới thay vì muốn sửa đổi một hiện có bằng cách sử dụng chuỗi suối, bạn cũng có thể muốn sử dụng Karma từ get-go.

+0

Trong khi triển khai thay đổi, tiêu chuẩn thực hiện các yêu cầu hiệu suất chung trong nhiều trường hợp. Tôi tin rằng đó là những gì mà OP đang hỏi. –

+0

@Roger Pate: Chắc chắn có những yêu cầu phức tạp trong tiêu chuẩn, nhưng tôi không nhớ bất kỳ điều gì sẽ ngăn cản việc triển khai ostringstream bằng cách sử dụng một bộ đệm liền kề hoặc nhiều bộ đệm kích thước cố định. Trong thực tế, cá nhân tôi không nhớ bất kỳ thông số kỹ thuật phức tạp cho các chức năng dòng i/o tiêu chuẩn ở tất cả. Bạn có? – usta

4

27.7.3/1 nói rằng basic_ostringstream sử dụng số basic_stringbuf. Tôi nghĩ rằng 27.7.1.3/8 nói rằng basic_stringbuf làm cho không gian bằng cách tái phân bổ một bộ đệm, và thậm chí không đảm bảo tăng trưởng theo cấp số nhân (và do đó được khấu hao O (1) để nối thêm).

Nhưng tôi thấy phần luồng của tiêu chuẩn không thể xuyên thấu được và luôn có quy tắc "as-if". Vì vậy, tôi không thể hứa với bạn rằng sử dụng một bên dưới deque (và củng cố khi ai đó yêu cầu chuỗi/bộ đệm) thực sự bị cấm.

+0

basic_stringbuf không phải lưu trữ bộ nhớ của nó ở định dạng liền kề do đó khi bộ đệm của nó đầy, nó sẽ không cần tái phân bổ (tức là di chuyển bộ nhớ gốc) nhưng có thể làm cho nó hoạt động giống như std :: deque. Vì STL là mã nguồn mở, bạn có thể xem cách bất kỳ nhà cung cấp cụ thể nào thực hiện basic_stringbuf. – CashCow

Các vấn đề liên quan