C++ 可以从';从这个';提高性能?

C++ 可以从';从这个';提高性能?,c++,performance,c++11,shared-ptr,C++,Performance,C++11,Shared Ptr,make_shared比单独调用new和创建shared_ptr更有效,因为make_shared在与客户端对象实例相同的内存块中为引用计数和弱计数分配空间(有效地为共享的\u ptr提供了侵入式\u ptr的大部分性能优势) enable_shared_from_此提供了一个共享指针,而没有对任何共享指针的引用。因此,必须从客户端对象内部以某种方式访问引用和弱计数等内容。因此,enable_shared_from_this会导致类似于make_的侵入性计数共享 然而,我不知道这样的东西是如何实

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

enable_shared_from_此
提供了一个共享指针,而没有对任何共享指针的引用。因此,必须从客户端对象内部以某种方式访问引用和弱计数等内容。因此,
enable_shared_from_this
会导致类似于
make_的侵入性计数共享

然而,我不知道这样的东西是如何实现的(而且我不确定我是否会关注其中发生的事情,即使我查看实际的源代码)


那么这有意义吗(出于性能原因)如果我知道我的类只会被用作
共享的ptr
而不会被用作原始对象,那么用
enable_shared_from_this
来标记我的类?

Boost的
enable_shared_from_这不会改变
共享的ptr
本身的实现。记住
共享的ptr
弱的ptr配对de>-这意味着,即使在删除对象后,跟踪数据也可能需要保留在周围,以告知
弱ptr
对象已死亡。因此,即使使用
从该
启用共享,它也无法嵌入到对象中。所有
从该
启用共享_的操作都将指向所述跟踪数据的指针嵌入到e对象,因此只需指向该对象的指针就可以构造一个
共享\u ptr


这也是为什么
侵入式\u ptr
不能有
弱侵入式\u ptr
变体的原因。

我从来没有深入研究过实现的细节,但要想从这个
共享\u ptr工作,对象必须已经由外部
共享\u ptr
管理,因此它在某种程度上是不相关的。例如,第一个
共享\u ptr
可能是使用
make_shared
创建的,在这种情况下,count和object是在一起的(就像您所说的入侵指针一样),但不需要这样

我的第一个猜测是,
enable_shared_from_此
添加了一个相当于
weak_ptr
,而不是一个
shared_ptr
。编辑:我刚刚验证了gcc4.6中的实现:

template <typename _Tp>
class enable_shared_from_this {
...
mutable weak_ptr<_Tp> _M_weak_this;
};
模板
类从\u中启用\u共享\u{
...
可变弱ptr(mu M)弱(mu this);;
};

我不这么认为。如何实现该
启用共享\u这个
并没有严格定义,但标准中给出了一个示例实现,对应于boost是如何实现的。基本上,存在一个隐藏的
弱\u ptr
,该
共享\u ptr
和朋友可以随时访问…共享\u ptr
被赋予从
启用\u共享\u from\u this
派生的对象的所有权,它将更新该内部指针。然后
共享\u from\u this()
只返回该弱指针的强版本


在一般情况下,实现不能真的假设没有人会去共享
而不是使用
使\u共享
,因此侵入式引用计数将是危险的。你可以自己做这项担保,不管你首先使用什么方法来构造对象。

但是如果你知道它将只用于
共享\u ptr
,为什么不使它适用于
侵入式\u ptr
instread?@Armen:如果我使用的是
std::shared\u ptr
(没有
std::intrusive\u ptr
,是吗?我不确定…)当然,如果我已经在使用Boost,我会使用
侵入式ptr
。我也不认为
侵入式ptr
有一个
变体。如果只有在不使用
时优化才有效,这是可以接受的吗?
使用计数()
必须准确吗?@curiousguy:我相信答案是肯定的“不,没有绩效效益"因此,不,优化没有效果,因为它根本没有效果。如果我们可以假设没有重载运算符delete,没有Deleter,也没有
弱ptr
,那么就有可能优化内存分配。呃,它当然可以嵌入到对象中。
使共享
已经做到了!@Billy ONeal:那不是嵌入的“我认为这是可能的。
shared\u ptr
已经必须更改它的实现,以便在指定了
enable\u shared\u from\u后更新客户端对象内部的状态。@David:这意味着shared\u ptr的构造函数需要更改。”如果
enable_shared_from_,这就是调用该成员来更新弱的\u ptr的行为。@David:我会称之为“更改实现”。它是根据是否从中启用\u shared_来更改其行为。这在变量上被标记。@Billy:risk:您创建了对象(带有嵌入计数),您将其绑定到一个
共享的\u ptr
,然后提取一些
弱的\u ptr
,然后释放
共享的\u ptr
。其效果是对象被销毁(调用删除器),但引用计数(弱引用计数)释放count对象仍然需要。如果count嵌入到对象中,那么那些
弱\u ptr
将指的是一个已销毁的对象,访问count的权限将是UB。哦,好吧……这没有风险,只是未定义的行为。这不是我想的,但它工作得更好。我更考虑的是abigui关于将语句
T*T=new T
作为指向引用计数为0的对象的指针。如果引用计数为z