2010-03-31 22 views
6

Tại sao tăng :: fast_pool_allocator được xây dựng trên đầu trang của một hồ bơi đơn, và không phải là một hồ bơi riêng biệt cho mỗi cá thể cấp phát? Hoặc để đặt nó một cách khác, tại sao chỉ cung cấp đó, và không phải là tùy chọn có một hồ bơi cho mỗi cấp phát? Có phải đó là một ý tưởng tồi?boost pool_alloc

Tôi có một lớp sử dụng nội bộ khoảng 10 loại tăng khác nhau :: unordered_map. Nếu tôi đã sử dụng std :: allocator thì tất cả bộ nhớ sẽ quay trở lại hệ thống khi nó được gọi là delete, trong khi bây giờ tôi phải gọi release_memory trên nhiều kiểu phân bổ khác nhau tại một số điểm. Tôi có phải là ngu ngốc để cuộn phân bổ của riêng tôi sử dụng hồ bơi thay vì singleton_pool?

nhờ

Trả lời

4

Thật khó cho một cấp phát để có trạng thái, vì tất cả các trường hợp của một cấp phát phải được 'tương đương' được sử dụng bởi các thư viện chuẩn (ít nhất portably).

Từ 20.1.5/4 "yêu cầu cấp phát":

Triển khai các container được mô tả trong tiêu chuẩn này được phép giả định rằng tham số cấp phát mẫu của họ đáp ứng được hai yêu cầu bổ sung sau đây ngoài những trong Bảng 32.

  • Tất cả các trường hợp của một loại cấp phát cho bắt buộc phải được hoán đổi cho nhau và luôn so sánh tương đương với nhau

Nó sau đó tiếp tục nói:

implementors được khuyến khích cung cấp các thư viện có thể chấp nhận allocators mà gói gọn mô hình bộ nhớ tổng quát hơn và hỗ trợ các trường hợp không bình đẳng. Trong các triển khai như vậy, bất kỳ yêu cầu nào áp dụng cho các bộ phân bổ bởi các thùng chứa vượt ra ngoài các yêu cầu xuất hiện trong Bảng 32 và ngữ nghĩa của các thùng chứa và các thuật toán khi các cá thể cấp phát so sánh không bằng nhau, được định nghĩa thực hiện.

Vì vậy, việc triển khai có thể được viết để cho phép các trường hợp phân bổ không tương đương, nhưng khi đó người cấp phát của bạn phụ thuộc vào hành vi được thực hiện.

Xem this other SO answer cho một số chi tiết bổ sung (và có vẻ như tôi cần phải có xu hướng một số cập nhật hứa của câu trả lời mà ...)

+0

Hmm, lỗi vào thùng rác bình luận cuối cùng của tôi. Cảm ơn lời giải thích. Có lẽ tôi có thể lấy đi với nó nếu tôi dính vào sử dụng unordered_map, và tránh unordered_map :: operator = hoặc unordered_map :: swap –

+0

Điều này thực sự sẽ thay đổi trong C++ 0x. –