Có C++ 11 có thứ gì đó tương đương với tăng :: intrusive_ptr không?
số
Nó có std::make_shared
có nghĩa std::shared_ptr
gần như (xem lưu ý dưới đây) hiệu quả như một con trỏ thông minh xâm nhập, bởi vì số lượng tài liệu tham khảo sẽ được lưu trữ trong bộ nhớ liền kề với đối tượng tự , cải thiện địa phương tham chiếu và sử dụng bộ nhớ cache. Nó cũng cung cấp std::enable_shared_from_this
cho phép bạn truy xuất std::shared_ptr
khi bạn chỉ có con trỏ cài sẵn cho đối tượng thuộc sở hữu của shared_ptr
, nhưng điều đó không cho phép bạn quản lý đối tượng bằng các loại con trỏ thông minh khác nhau.
shared_ptr
dự kiến hoàn toàn chịu trách nhiệm quản lý đối tượng. Một loại con trỏ thông minh khác chỉ có thể quản lý số lần truy cập "mạnh" và không phải là số đếm ngược "yếu", điều này sẽ cho phép số lượng không đồng bộ và phá vỡ các bất biến của shared_ptr
.
Lưu ý: Sử dụng make_shared
phép shared_ptr
là gần hiệu quả như một con trỏ xâm nhập. Đối tượng và thông tin đếm tham chiếu có thể được phân bổ trong một đoạn bộ nhớ khi sử dụng make_shared
nhưng vẫn có hai số tham chiếu (đối với số lượng "mạnh" và "yếu") không phải là trường hợp con trỏ xâm phạm vì họ không hỗ trợ một số weak_ptr
. Ngoài ra, đối tượng shared_ptr
luôn luôn lưu trữ hai con trỏ (con trỏ sẽ được trả về bởi shared_ptr::get()
và một con trỏ khác đến "khối điều khiển" chứa số tham chiếu và biết loại động của đối tượng sở hữu) để có dấu chân lớn hơn hơn một con trỏ xâm nhập.
Nguồn
2012-12-17 11:22:13
Bạn có thể thực hiện triển khai 'intrusive_ptr' bằng cách sử dụng trình bao bọc xung quanh' unique_ptr' với dấu phân cách tùy chỉnh, cho phép bạn tạo số tham chiếu an toàn (hoặc không). Nó không phải là dễ dàng để vượt qua xung quanh (yêu cầu di chuyển, hoặc thao tác thủ công đếm ref), nhưng có thể. – Chad