c++ - 从 'enable_shared_from_this' 派生一个类可以提高性能吗?

标签 c++ performance c++11 shared-ptr

make_shared 比单独调用 new 并创建 shared_ptr 性能更高,因为 make_shared 为引用分配空间在与客户端对象实例相同的内存块中计数和弱计数(有效地为 shared_ptr 提供了 intrusive_ptr 的大部分性能优势)。

enable_shared_from_this 给出一个共享指针,而不引用任何共享指针。因此,必须以某种方式从客户端对象内部访问诸如引用和弱计数之类的东西。因此,enable_shared_from_this 导致类似于 make_shared 的侵入性计数是明智的。

但是,我不知道如何实现类似的东西(即使我查看实际来源,我也不确定我是否会关注其中发生的事情)。

如果我知道它只会用作 shared_ptr 而永远不会用作原始对象?

最佳答案

我从来没有深入研究过实现的细节,但是要使 shared_from_this 工作,对象必须已经由外部 shared_ptr 管理,所以在某种程度上是无关。 IE。第一个 shared_ptr 可能是用 make_shared 创建的,在这种情况下 countobject 在一起(如你所说intrusive pointer like),但不一定是这样。

我的第一个猜测是 enable_shared_from_this 添加了 weak_ptr 的等效项,而不是 shared_ptr编辑:我刚刚验证了gcc4.6中的实现:

template <typename _Tp>
class enable_shared_from_this {
...
mutable weak_ptr<_Tp> _M_weak_this;
};

关于c++ - 从 'enable_shared_from_this' 派生一个类可以提高性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6513660/

相关文章:

c++ - 将提升范围适配器与目录迭代器范围一起使用

c++ - 如何释放重新分配的内存? C++

PHP地雷一般

c++ - std::make_pair 与 C++11 统一初始值设定项

C++ 字符串数组的动态 vector

c++ - 运行时检查失败 #2 - 变量 'numberchoices' 周围的堆栈已损坏

c++ - 编写一个需要面向对象的库。 Objective-C 或 C++ 与 C 的最高兼容性?

c++ - 如何在不导致实例化的情况下获得函数模板的签名?

javascript - 使用许多事件监听器优化 javascript 性能

c# - 等待网络 C# 控制台应用程序完全启动