当一个函数采用 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 许可协议
当一个函数采用 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 许可协议
众所周知,按值传递 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 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
Scott、Andrei 和 Herb 在 C++ and Beyond 2011 的 Ask Us Anything 会议上讨论并回答了这个问题。从 4:34 开始观看
shared_ptr
性能和正确性。简而言之, 没有理由按值传递,除非目标是共享对象的所有权(例如,在不同的数据结构之间,或在不同的线程之间)。
除非您可以按照 Scott Meyers 在上面链接的谈话视频中的解释对其进行移动优化,但这与您可以使用的实际 C++ 版本有关。
在 GoingNative 2012 会议的 互动小组:问我们任何问题! 值得一看,尤其是从 22:50 开始。