【发布时间】:2011-02-14 10:34:32
【问题描述】:
我目前正在为游戏设计一个对象结构,在我的例子中,最自然的组织变成了一棵树。作为智能指针的忠实粉丝,我专门使用shared_ptr's。然而,在这种情况下,树中的子节点需要访问它的父节点(例如——地图上的生物需要能够访问地图数据——因此他们的父节点的数据。
拥有的方向当然是地图拥有它的存在,因此持有指向它们的共享指针。然而,要从一个存在中访问地图数据,我们需要一个指向父级的指针——智能指针的方式是使用一个引用,即weak_ptr。
然而,我曾经读到锁定 weak_ptr 是一项昂贵的操作——也许这不再是真的了——但考虑到 weak_ptr 会经常被锁定,我担心这种设计注定要表现不佳。
因此问题:
锁定一个weak_ptr 的性能损失是什么?它有多重要?
【问题讨论】:
-
我不确定,但我猜它应该大致相当于复制构建shared_ptr的成本。
-
@James - 所以我假设锁定只是分配的引用计数器的读取和复制......
-
@Kornel:这是引用计数的原子增量;它的实现方式是非常特定于平台的(互斥锁将是最坏的情况;在 Windows 上它是使用 InterlockedIncrement 实现的,我确信 Linux 和其他操作系统具有类似的内置原子操作)。
-
@Kornel:肯定会有性能损失。取消引用 shared_ptr 应该与取消引用原始指针一样快,因为这就是它在内部要做的所有事情(每个 shared_ptr 对象都有自己的指针副本)。如果已删除答案中推荐的解决方案适用于您的特定用例,那将为您提供更好的性能(我很惊讶答案已被删除)。
-
只使用原始指针指向父级,安全高效。
标签: c++ performance boost weak-ptr