2011-07-28 32 views
11

Chuẩn C++ 11 mới yêu cầu triển khai STL để hỗ trợ các bộ phân bổ stateful trong các thùng chứa. Thực hiện STL chính (Visual Studio 2008, 2010, libstdC++) có tuân thủ yêu cầu này ngay bây giờ không? Tôi không tìm thấy gì về điều này trong MSDN hoặc trong tài liệu libstdC++.hỗ trợ trình biên dịch cho các bộ phân bổ stateful trong các thùng chứa STL

+0

Bạn có muốn chấp nhận một trong các câu trả lời này không? – spraff

Trả lời

14

Hình như các tính năng của allocators stateful trong STL container được hỗ trợ rộng rãi rồi. Trong hầu hết các trường hợp statefullness của cấp phát không gây rắc rối. Những gì không được hỗ trợ rộng rãi được nêu ra là cách tiêu chuẩn mới để xử lý các tình huống có vấn đề (trao đổi một container (cho dù để trao đổi các phân bổ quá), mối nối của danh sách).

This thread nói:

trong mã đối với hầu hết các thư viện tiêu chuẩn hiện hành (bao gồm cả Dinkumware như được sử dụng bởi MS), allocators stateful được hỗ trợ

This tread (libstdC++, 2004) nói (nếu tôi hiểu đúng):

Chúng tôi đã hỗ trợ người phân bổ ở đâu l1.get_allocator() != l2.get_allocator(). Những gì chúng tôi không làm là thực hiện bất kỳ điều khoản đặc biệt nào để phát hiện những người phân bổ đó theo số splice()swap().

This blog entry (libstdC++, 2009) nói:

container hiện trong chế độ C++ 0x hiện nay có hiệu quả hơn cùng với allocators stateful (tức là, không allocators được tạo ra khi đang bay vào thời điểm xây dựng yếu tố).

This document nói về mới libc++ library:

Tất cả container đáp ứng tất cả các yêu cầu cấp phát mới nhất mà hỗ trợ đầy đủ allocators stateful. - Không gian cho người phân bổ không trạng thái được tối ưu hóa.

EASTL hỗ trợ cấp phát trạng thái.

This thread chứa tranh chấp thú vị về mức độ di động của tính năng này. Vì vậy, hầu hết các triển khai STL đều hỗ trợ các trình phân bổ statefull, có nghĩa là chúng không tạo ra các thể hiện bổ sung của kiểu phân bổ dưới mui xe, nhưng lưu trữ cá thể cấp phát do máy khách cung cấp và tất cả các phân bổ/deallocations được thực hiện thông qua đó. Tuy nhiên, cách họ xử lý ping swaplist::splice không có giấy tờ, không di động.

CẬP NHẬT: STL của VS2008 yêu cầu người cấp phát phải có trình tạo bản sao được tạo khuôn mẫu, IMO làm cho việc sử dụng phân bổ tùy chỉnh quan trọng nhất là không thể: lưu trữ riêng biệt đơn giản.

Đối với bất kỳ ai không hài lòng với trạng thái hiện tại của nhà phân bổ nhà nước trong STL, tôi khuyên bạn nên xem xét Boost.IntrusiveBoost.Container.

+0

Trên thực tế các thư viện chuẩn _all_ yêu cầu các trình phân bổ để có một constructor sao chép theo khuôn mẫu và mẫu 'rebind' và sử dụng chúng. Điều này là do tất cả các container ngoại trừ 'vector' và' deque' phân bổ các phần tử là một phần của một số cấu trúc được định nghĩa thực hiện, do đó chúng phải tạo cấp phát cho cấu trúc đó từ cấp phát được cung cấp. Đó là một điều tác giả cấp phát chỉ đơn giản là phải đưa vào tài khoản. –

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