代码之家  ›  专栏  ›  技术社区  ›  Kornel Kisielewicz

弱电的性能惩罚是多少?

  •  24
  • Kornel Kisielewicz  · 技术社区  · 14 年前

    我正在为一个游戏设计一个对象结构,在我的例子中最自然的组织变成了一棵树。我非常喜欢我使用的智能指针 shared_ptr 是唯一的。但是,在这种情况下,树中的子对象需要访问其父对象(例如,地图上的生物需要能够访问地图数据,也就是他们父对象的数据)。

    拥有的方向当然是一个地图拥有它的存在物,因此拥有指向它们的共享指针。然而,要从存在中访问地图数据,我们需要一个指向父对象的指针——智能指针的方法是使用一个引用,例如 weak_ptr .

    但是,我曾经读过 弱者PTR 是一个昂贵的手术——也许这已经不是事实了——但是考虑到 弱者PTR 会经常被锁上,我担心这个设计注定性能不佳。

    因此,问题是:

    锁定一个弱ptr的性能损失是多少?有多重要?

    2 回复  |  直到 11 年前
        1
  •  12
  •   Billy ONeal IS4    14 年前

    来自boost 1.42源代码( <boost/shared_ptr/weak_ptr.hpp> 第155行):

    shared_ptr<T> lock() const // never throws
    {
        return shared_ptr<element_type>( *this, boost::detail::sp_nothrow_tag() );
    }
    

    因此,詹姆斯·麦克内利斯的评论是正确的;这是复制 shared_ptr .

        2
  •  6
  •   svick bala    11 年前

    对于我自己的项目,我可以通过添加 #define BOOST_DISABLE_THREADS 在任何提升包括之前。 这避免了弱ptr::lock的spinlock/mutex开销,在我的项目中 一个主要的瓶颈。由于该项目不是多线程wrt boost,我可以这样做。