Possible Duplicate:
Should I pass a shared_ptr by reference?
Passing smart pointers as arguments
我应该按值传递还是按常量引用传递?关于是按值还是按常量引用传递可复制构造对象,我已经阅读了许多经验法则。如:
- 通过常量引用传递对象并通过值构建类型(函数对象除外)
- 按值传递,除非对象的大小(包括动态内存)小于 2 * double 的大小。
您能否解释一下这些规则如何适用于 std::shared_ptr<Resource>
?我知道这个对象可能很小,可能是一个指针和一个引用计数器,但它仍然是一个对象。这里的最佳做法是什么?
也许最重要的问题(关于性能)是创建 std::shared_ptr<...>
的拷贝(例如当您按值传递时发生的情况)需要引用计数的互锁增量。或者可能是一些其他形式的同步,如关键部分,具体取决于实现。这样的成本在多线程程序中可能会很大。
几乎可以肯定,通过引用传递是更好的选择。它的主要缺点(或者这仅适用于 boost::shared_ptr<...>
吗?)是 shared_ptr<...>
仅提供标准线程安全保证:访问单个 shared_ptr<...>
必须加以保护(例如,通过互斥量),除非所有访问都仅针对 const 方法。在多线程情况下,将 const 引用传递给 shared_ptr<...>
这可能会使确保正确同步变得更加困难。
在单线程程序中,它可能没有太大区别。