2009-08-07 20 views
9

Tôi đang sử dụng một số std::deque để lưu trữ số lượng đối tượng khá lớn. Nếu tôi loại bỏ một loạt các đối tượng, nó xuất hiện với tôi rằng việc sử dụng bộ nhớ của nó không giảm, trong một thời trang tương tự như std :: vector.Làm thế nào để phát hành bộ nhớ từ std :: deque?

Có cách nào để giảm bớt không? Tôi biết rằng trong một vector bạn phải sử dụng 'thủ thuật trao đổi', mà tôi giả định cũng sẽ làm việc ở đây, nhưng tôi muốn tránh điều đó vì nó sẽ yêu cầu sao chép tất cả các phần tử còn lại trong thùng chứa (và do đó yêu cầu bạn có đủ bộ nhớ để lưu trữ mọi đối tượng hai lần). Tôi không quen thuộc với việc thực hiện deque, nhưng sự hiểu biết của tôi về nó là nó có thể có thể đạt được một điều như vậy mà không có nhiều bản sao (trong khi với một vector rõ ràng là không).

Tôi đang sử dụng VC++ (Dinkumware) STL, nếu điều đó tạo ra bất kỳ sự khác biệt nào.

+2

Bạn đã thiết lập rằng việc triển khai deque của bạn chưa giải phóng các khối bộ nhớ ngay sau khi đủ các mục được xóa để xóa chúng? Hay là bạn thực sự muốn nén vài byte cuối cùng bằng cách tái phân bổ khối ở mỗi đầu? –

+0

Tôi nghĩ vậy, theo cách khá thô lỗ và sẵn sàng: tôi thêm 100.000 mục -> Mức sử dụng bộ nhớ ~ 90MB. Tôi thêm 100.000 -> sử dụng bộ nhớ khác là ~ 170MB. Tôi xóa 100.000 mục -> sử dụng bộ nhớ vẫn còn ~ 170MB. Thêm 100.000 -> vẫn còn 170. Tôi giả định 100.000 mặt hàng là quá đủ để nó có các khối trống mà nó sẽ được giải phóng nếu nó sắp sửa. – Peter

+5

Sử dụng bộ nhớ của quá trình hoặc sử dụng bộ nhớ của bộ sưu tập? Chỉ vì bộ sưu tập giải phóng bộ nhớ không có nghĩa là nó quay trở lại hệ điều hành, vì vậy hãy thử phân bổ 80MB mảng char sau khi loại bỏ các mục và xem liệu việc sử dụng có đến 250MB hay vẫn ở mức 170. Xin lỗi nếu bạn đã biết tất cả điều này công cụ và đã chiếm nó - hàng triệu người sẽ không. –

Trả lời

14

Không có cách nào để thực hiện việc này trực tiếp trong std :: deque. Tuy nhiên, nó rất dễ dàng để làm bằng cách sử dụng tạm thời (mà về cơ bản là những gì xảy ra trong một std :: vector khi bạn thu nhỏ dung lượng của nó).

Đây là số good article on std::deque, so sánh nó với tiêu chuẩn :: vector. Phần dưới cùng cho thấy một cách sạch sẽ để hoán đổi và thu nhỏ một vectơ, hoạt động tương tự với deque.

+0

Cảm ơn. Tôi nghi ngờ rằng có thể không có cách nào để làm điều đó, nhưng có vẻ như nó sẽ là có thể ... Tôi giải thích trong câu hỏi tại sao tôi không thích sử dụng điều hoán đổi trong trường hợp này, nhưng có lẽ tôi sẽ phải nhìn vào nó bất kể. – Peter

+0

Peter - tùy chọn tốt nhất với điều "hoán đổi" là sử dụng các phần tử được cấp phát heap. Trong trường hợp đó, bạn chỉ tạo một bản sao tài liệu tham khảo, thay vì một bản sao của tất cả các phần tử cộng với bộ nhớ của chúng. Đó là khá nhỏ, thường. –

+0

Điều hoán đổi chỉ bao giờ hoán đổi các con trỏ nội tại của vectơ, chứ không phải bản thân các phần tử. – Karu

4

Kích thước bộ nhớ của deque có thể hoặc không co lại. KhiCách điều này xảy ra là việc triển khai cụ thể. Thật không may bạn không có nhiều điều khiển bằng tay về điều này vì deques thiếu công suất() hoặc dự trữ().

Tôi khuyên bạn nên hoán đổi() nếu bạn thực sự phát hiện ra bản phát hành bộ nhớ không được thực hiện một cách thuận tiện.

Một kiến ​​thức sâu sắc về quản lý bộ nhớ deque lẽ có thể được thu được từ trang web Dikum (đây là thực hiện hiện tại của bạn, phải không?)

1

std :: deque sẽ trở lại bộ nhớ để cấp phát của nó. Thường thì trình cấp phát này sẽ không trả lại bộ nhớ cho hệ điều hành. Trong trường hợp như vậy, nó xuất hiện như thể bộ nhớ không phải là "phát hành". Bộ dò tìm rò rỉ bộ nhớ tốt sẽ được đáp ứng ngay sau khi bộ nhớ được trả về bộ cấp phát và hiểu rằng không phải tất cả bộ nhớ đều được phát hành bởi free().

3

Như thêm thông tin thế này:

Trong C++ 0x/C++ 11, deque (và một số đồ chứa khác) có một chức năng mới được gọi là "shrink_to_fit" sẽ loại bỏ các mục thừa và về cơ bản sắp xếp công suất() == size()

+0

capacity() vẫn có thể cao hơn size() sau shrink_to_fit() - nó là một yêu cầu không ràng buộc; 'void shrink_to_fit() {}' là một thực thi pháp lý hoàn hảo. Nhưng ngay cả với việc triển khai tốt, dung lượng() có thể cao hơn kích thước(), ví dụ nếu vùng chứa có quá ít phần tử, thì vẫn có thể phân bổ nhiều bộ nhớ hơn. (Hãy suy nghĩ về các thùng chứa rỗng.) – Lrdx

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