如何将std :: shared_ptr <resource>传递给函数?</resource>

时间:2012-07-12 06:07:41

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

  

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

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

  1. 通过常量引用传递对象,并按值(函数对象除外)构建内置类型
  2. 按值传递,除非对象的大小(包括动态内存)小于2 *的大小。
  3. 您能否解释这些规则如何适用于std::shared_ptr<Resource>?我知道对象可能非常小,可能是指针和引用计数器,但它仍然是一个对象。这里的最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

也许最重要的问题(关于性能)是创建std::shared_ptr<...>的副本(例如当你通过值时发生)需要引用计数的互锁增量。或者可能是其他形式的同步,如关键部分,具体取决于实现。在多线程程序中,这样的成本可能很大。

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

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