【问题标题】:How to pass a std::shared_ptr<Resource> to a function? [duplicate]如何将 std::shared_ptr<Resource> 传递给函数? [复制]
【发布时间】:2012-07-12 06:07:41
【问题描述】:

可能重复:
Should I pass a shared_ptr by reference?
Passing smart pointers as arguments

我应该通过值还是通过常量引用传递它?我已经阅读了许多关于是通过值还是通过常量引用传递复制可构造对象的经验法则。如:

  1. 通过常量引用传递对象并按值传递内置类型(函数对象除外)
  2. 按值传递,除非对象(包括动态内存)的大小小于 2 * double 的大小。

您能否解释一下这些规则如何适用于std::shared_ptr&lt;Resource&gt;?我知道该对象可能非常小,可能是一个指针和一个引用计数器,但它仍然是一个对象。这里的最佳做法是什么?

【问题讨论】:

  • 我的经验法则是:当你想要引用语义时通过引用传递,当你想要值语义时通过值传递。我认为它们优于您一直在阅读的那些。 (它们也更容易记住:P)
  • @RMartinhoFernandes: const 引用是如何计算的?我经常阅读的经验法则建议在我本质上对值语义感兴趣(我认为这意味着在不更改对象的情况下查询对象)而不是引用语义(我希望能够修改对象的情况下)通过 const 引用传递.) 或者你只是在陈述一个重言式:“当你想要引用时通过引用传递,当你想要值时通过值传递”?
  • 引用,无论是否为 const,都提供引用语义:当变量引用同一个对象时。缺少引用提供了值语义:当变量引用不同的对象时。您描述的是可变性,这是选择 const 或 non-const 的标准。

标签: c++ c++11 shared-ptr


【解决方案1】:

也许最重要的问题(关于性能)是创建std::shared_ptr&lt;...&gt; 的副本(例如在按值传递时发生)需要一个互锁的引用计数增量。或者可能是其他形式的同步,例如关键部分,具体取决于实现。在多线程程序中,这样的开销可能很大。

通过引用传递几乎肯定是更好的选择。它的主要缺点(或者这仅适用于boost::shared_ptr&lt;...&gt;?)是shared_ptr&lt;...&gt; 仅提供标准线程安全保证:必须保护对单个shared_ptr&lt;...&gt; 的访问(例如通过互斥锁),除非所有访问都仅针对 const方法。在多线程情况下,传递对 shared_ptr&lt;...&gt;s 的 const 引用可能会使确保正确同步变得更加困难。

在单线程程序中,它可能没有太大区别。

【讨论】:

  • 我完全不同意这是最重要的问题。最重要的问题应该是获得正确的程序,即是否要共享所有权。
  • @RMartinhoFernandes:好点。我想我的意思是“与性能有关的最重要的问题”。虽然我知道我可能应该只回答“向您友好的分析器询问性能。”
  • 无论如何,您似乎在争论通过引用传递(抛开为什么有人甚至想要对智能指针的引用的问题)性能更高,因为,而不是潜在的无锁操作,相反,您可以获得可以使用互斥锁解决的同步问题。对我来说听起来倒退了。
  • @RMartinhoFernandes:你的概要是准确的。无锁操作并非没有同步成本。而且我很少发现自己确实需要保护对shared_ptr&lt;...&gt; 的访问——为了完整起见,我只是将其包括在内。
猜你喜欢
  • 2012-08-13
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
相关资源
最近更新 更多