1

可能重复:
我应该通过引用传递 shared_ptr 吗?
将智能指针作为参数传递

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

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

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

4

1 回答 1

0

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

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

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

于 2012-07-12T06:17:04.293 回答