无论出于何种原因,我们都会从破坏弱指针中看到相当多的成本。这是罪魁祸首代码:
~weak_count() // nothrow
{
if(pi_ != 0) pi_->weak_release(); // Consumes a huge chunk of our time.
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
id_ = 0;
#endif
}
我们没有处于调试模式,并且调试挂钩未启用。弱释放正在消耗真正惊人的时间。这是一个已知的问题?我们做错了吗?
提升版:1.36
编译器:VS2008编译器套件。
不幸的是,由于各种原因,我们被锁定在这个Boost版本中,所以我更想知道这些奇怪的支出是否可以在新版本上重复,或者代表已知不良做法的结果。我们只破坏了500k弱指针的顺序,它们不会因破坏相似数量的原始指针而在性能上产生明显的差异。当然不会增加2.5-4倍的成本。请注意,我们不会删除所述指针所针对的对象。这笔费用完全来自指针本身的销毁。
这里发生了什么?
答案 0 :(得分:4)
weak_ptr
需要像shared_ptr
这样的东西来实现自己 - 因为它需要能够确定指针是否仍然存在,它需要在某处维护它自己的引用计数的引用计数结构
即,weak_ptr
如何确定对象是否仍然存在,除非引用计数以某种方式保持可用以使其到达? :)
如果您不需要使用weak_ptr
实际获取一段代码的所有权,那么您可以通过传递原始指针而不是weak_ptr
来逃脱。
答案 1 :(得分:2)
最有可能的是,成本来自引用计数的原子减量,与整数分配相比,它相当昂贵,并且可能导致缓存(或非常极端,页面)未命中/错误,并且是原子操作,它也可能导致高速缓存行失效等事情。
然而,破坏原始指针是一种无操作,所以我不完全确定你对weak_ptr的期望是什么,但如果它提供任何类型的破坏语义,它在物理上不可能提供相同的破坏成本。
同样地,你可能会过度使用它们。所有权执行指针不是银弹 - 您仍然需要考虑谁拥有该对象。大量使用弱指针向我表明,你并没有真正考虑过你的所有权语义。
最后,在std :: tr1命名空间中,MSVC 2008中有一个shared_ptr和weak_ptr的实现。你可以试试。