2013-08-26 28 views
6

Tôi đang xem xét sử dụng std::queue (với std::deque) cho cấu trúc FIFO.std :: xếp hàng tôi nên thu nhỏ để vừa?

Trong cấu trúc dữ liệu hàng đợi, dữ liệu chỉ được đẩy ở mặt sau và xuất hiện ở mặt trước. Vì vậy, bộ nhớ ở phía trước sau khi popping một phần tử sẽ không bao giờ được sử dụng.

Tôi nhớ rằng std :: vector không giải phóng bộ nhớ cho đến khi tôi gọi phương thức shrink_to_fit một cách rõ ràng. Điều gì về std::deque?

Vì vậy, tôi có nên xem xét giải phóng bộ nhớ ở mặt trước không bao giờ được sử dụng lại không?

+3

'std :: vector' không phải giải phóng bộ nhớ trong cuộc gọi đến' shrink_to_fit'. – juanchopanza

+0

@juanchopanza Sau đó, mục đích của phương thức 'shrink_to_fit' là gì? – Sungmin

+0

@Sungmin: Mục đích là nó là một gợi ý cho việc thực hiện. – ronag

Trả lời

5

Bạn không cần chính xác shrink_to_fit cho hàng đợi, nếu nó được sử dụng bình thường. 's shrink_to_fit là có nghĩa là cho các tình huống mà nội dung vector đã giảm đi một lượng lớn, do đó nó thực sự có một lợi ích để gọi sự tái phân bổ (khá tốn kém) để giải phóng lượng bộ nhớ khổng lồ đó. Nói chung không cần thiết nếu véc tơ có tuổi thọ ngắn hoặc nếu kích thước của nó không thay đổi quá nhiều.

Có nói rằng, std::deque là một loại thú khác. Nó thường là bao gồm các khối bộ nhớ có kích thước cố định. Nếu bạn xóa nhiều phần tử từ deque, các khối không còn chứa bất kỳ phần tử nào có thể/sẽ được deallocated. Vì vậy, chi phí bộ nhớ lớn nhất bạn có thể có bất cứ lúc nào là một chút dưới hai lần kích thước chunk, ví dụ nếu hàng đợi chỉ chứa hai phần tử, một phần tử ở cuối đoạn, phần thứ hai ở đầu đoạn tiếp theo. Do đó, std::deque::shrink_to_fit chỉ có thể di chuyển các phần tử của deque theo cách giải phóng chính xác một đoạn, mà không phải là một lợi ích lớn (iirc một thực hiện điển hình có kích thước chunk của một vài kb).

Đây là những tuyên bố rất chung chung có thể không áp dụng trong các tình huống quan trọng của bộ nhớ. Nhưng như tiêu chuẩn vùng chứa, không phải véc tơ không deque được thiết kế rõ ràng để được sử dụng trong các tình huống exetreme như vậy. Nếu dấu vết bộ nhớ là một vấn đề trong một phần của chương trình mà bạn sử dụng hàng đợi, bạn có thể muốn sử dụng một cấu trúc dữ liệu khác.

+0

Cảm ơn. Nó giải thích mọi thứ tôi muốn biết :) – Sungmin

+0

Bạn thậm chí có phương thức 'shrink_to_fit' trên' std :: deque'? (Tôi không có một bản sao của C++ 11 trên máy này để xác minh, nhưng tôi sẽ không mong đợi nó có mặt.) –

+0

@JamesKanze có một phương thức 'std :: deque :: shrink_to_fit'. Thật không may tôi không có một C++ 11 thực hiện mà tôi có thể xem xét ở đây. – juanchopanza

7

Đặc điểm phân bổ bộ nhớ của std::deque được xác định thực hiện. Tiêu chuẩn không yêu cầu cụ thể khi bộ nhớ được cấp phát hoặc phát hành đến mức deque s có liên quan. Các yêu cầu tiệm cận về chèn, xóa và truy cập hiệu suất truy cập dọc theo các dòng nhất định. Nhưng có thể có nhiều biến đổi trong đó.

Nói chung, nếu bạn bật đủ thứ từ phía trước của deque, sự sắp xếp bộ nhớ sẽ xảy ra.

+0

Ồ tôi hiểu rồi, Cảm ơn. – Sungmin

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