在c++11中使用intrusive_ptr

intrusive_ptr in c++11

本文关键字:intrusive ptr c++11      更新时间:2023-10-16

C++11是否具有与boost::intrusive_ptr等价的东西?

我的问题是,我的C++代码上有一个C风格的接口。接口的两侧都可以使用C++,但出于兼容性原因,需要公开C接口。我不能使用std::shared_ptr,因为我必须通过两个(或多个)智能指针来管理对象。我无法用boost::intrusive_ptr这样的东西找到解决方案。

c++11是否具有与boost::intrusive_ptr等效的功能?

否。

它确实有std::make_shared,这意味着std::shared_ptr的效率几乎与侵入式智能指针一样高,因为引用计数将存储在对象本身的内存中,从而提高引用的位置性和缓存使用率。它还提供了std::enable_shared_from_this,当您只有指向shared_ptr拥有的对象的内置指针时,它允许您检索std::shared_ptr,但不允许您使用不同的智能指针类型来管理对象。

shared_ptr希望完全负责管理该对象。不同的智能指针类型可能只管理"强"refcount而不管理"弱"refcount,这将允许计数不同步并破坏shared_ptr的不变量。


注意:使用make_shared可以使shared_ptr效率几乎与侵入指针一样高。当使用make_shared时,对象和引用计数信息可以分配在单个内存块中,但仍然会有两个引用计数(针对"强"answers"弱"计数),而侵入式指针则不是这样,因为它们不支持weak_ptr。此外,shared_ptr对象本身总是必须存储两个指针(一个将由shared_ptr::get()返回,另一个指向"控制块"的指针包含引用计数并知道所属对象的动态类型),因此其占用空间比侵入指针大。