enable_shared_from_this和make_shared是否提供相同的优化

时间:2016-07-15 13:19:53

标签: c++ shared-ptr make-shared

据我所知make_shared<T>(...)可以提供一些内存分配优化(它可以在与T类实例相同的内存块中分配引用计数器)。

enable_shared_from_this提供相同的优化吗?所以:

class T : std::enable_shared_from_this<T> {};
...
auto t = std::shared_ptr<T>(new T);

与:

相同
class T {};
...
auto t = std::make_shared<T>();

如果不考虑sizeof(T)。

1 个答案:

答案 0 :(得分:9)

  

enable_shared_from_this提供相同的优化吗?所以:

没有。从标准中的措辞可以看出,enable_shared_from_this<T>有一个weak_ptr<T>数据成员。这会向类中添加weak_ptr<T>,该类具有指向包含引用计数的控制块的指针。它不直接包含引用计数。包含引用计数的控制块仍然存在于对象外部。

包含引用计数的控制块必须比对象寿命长,以便用于引用该对象的其他weak_ptr对象仍然可以访问控制块,以检查它是否已过期。

如果控制块在对象内部,则在对象被销毁时将被销毁,并且悬挂weak_ptr无法安全地确定对象是否已过期。从理论上讲,控制块的内存可以保持分配并仍然可以使用并更新引用计数,即使它们所属的对象被破坏了,但这看起来非常难看(这意味着对象不会被{{ {1}},它需要一个显式的析构函数调用和显式的delete调用来释放内存。)

如果使用自定义删除器或自定义分配器创建了拥有operator delete,您也无法使用嵌入式控制块,因为这些对象的大小不会提前知道。在这种情况下,除了 shared_ptr基类中嵌入的外,你还需要分配一个外部控制块,浪费更多的空间。