2013-07-15 28 views
5

std::unique_ptr làm cho Tăng cường.Thư chứa thư viện lỗi thời trong C++ 11/14 không?Boost.Pointer Container đã lỗi thời bởi std :: unique_ptr trong C++ 11/14?

Trong C++ 98/03 không được di chuyển ngữ nghĩa, và một con trỏ thông minh như shared_ptr có tài liệu tham khảo liên quan đếm overhead (cho cả khối ref đếm, và đan cài increment/suất này) nếu so với con trỏ thô. Vì vậy, một cái gì đó như std::vector<shared_ptr<T>> có trên không nếu so với std::vector<T*>.

Nhưng là std::vector<std::unqiue_ptr<T>> cũng giống như hiệu quả như std::vector<T*> (không tính tham khảo overhead), ngoài an toàn liên quan đến trường hợp ngoại lệ và hủy diệt tự động (ví dụ: vector<unique_ptr<T>> destructor sẽ tự động gọi destructors cho T các mục có con trỏ được lưu trữ trong vector)?

Nếu có, thì Boost.Pointer Container vẫn có một vị trí hữu ích hợp lệ trong mã C++ 11/14 hay chỉ là lỗi thời?

Trả lời

4

Như James đề cập đến trong câu trả lời của mình, các thùng chứa Boost.Pointer cung cấp giao diện trực quan hơn so với những gì bạn nhận được bằng cách dán unique_ptr vào một thùng chứa thư viện chuẩn.

Ngoài ra, boost::ptr_vector<T> (và bạn bè) lưu trữ loại được chỉ định là void * bên dưới, vì vậy bạn không nhận được toàn bộ mẫu lớp instantiation cho mỗi T. Đây không phải là trường hợp với vector<unique_ptr<T>>.

+2

'void *' hoisting cũng là một "tối ưu hóa đã biết" để giảm các mẫu instantiations cho 'std :: vector ', nhưng cả libC++ hiện tại lẫn libstdC++ hiện tại đều không sử dụng tối ưu hóa đó nữa. xem [câu trả lời này] (http://stackoverflow.com/a/13914629/819272) bởi @JonathanWakely. – TemplateRex

9

Nó không quá cũ; nó có một giao diện trực quan hoàn toàn khác và trực quan hơn std::vector<std::unique_ptr<T>>.

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