我们应该通过引用还是按值传递 shared_ptr ?

新手上路,请多包涵

当一个函数采用 shared_ptr (来自 boost 或 C++11 STL)时,您是否传递了它:

  • 通过常量参考: void foo(const shared_ptr<T>& p)

  • 或按值: void foo(shared_ptr<T> p)

我更喜欢第一种方法,因为我怀疑它会更快。但这真的值得吗,还是有任何其他问题?

你能否给出你选择的理由,或者如果是的话,为什么你认为这无关紧要。

原文由 Danvil 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.4k
2 个回答

Scott、Andrei 和 Herb 在 C++ and Beyond 2011Ask Us Anything 会议上讨论并回答了这个问题。从 4:34 开始观看 shared_ptr 性能和正确性

简而言之, 没有理由按值传递,除非目标是共享对象的所有权(例如,在不同的数据结构之间,或在不同的线程之间)。

除非您可以按照 Scott Meyers 在上面链接的谈话视频中的解释对其进行移动优化,但这与您可以使用的实际 C++ 版本有关。

GoingNative 2012 会议的 互动小组:问我们任何问题! 值得一看,尤其是从 22:50 开始。

原文由 mloskot 发布,翻译遵循 CC BY-SA 4.0 许可协议

众所周知,按值传递 shared_ptr 是有代价的,应尽可能避免。

通过 shared_ptr 的成本

大多数情况下,通过引用传递 shared_ptr,甚至通过 const 引用传递更好。

cpp 核心指南有一个特定的规则来传递 shared_ptr

R.34:带一个 shared_ptr 参数来表示一个函数是部分所有者

void share(shared_ptr<widget>);            // share -- "will" retain refcount

真正需要通过值传递 shared_ptr 的一个例子是调用者将共享对象传递给异步被调用者 - 即调用者在被调用者完成其工作之前超出范围。被调用者必须通过按值获取 share_ptr 来“延长”共享对象的生命周期。在这种情况下,传递对 shared_ptr 的引用是行不通的。

将共享对象传递给工作线程也是如此。

原文由 artm 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题