c++ - 如何将 std::shared_ptr<Resource> 传递给函数?

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

<分区>

Possible Duplicate:
Should I pass a shared_ptr by reference?
Passing smart pointers as arguments

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

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

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

最佳答案

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

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

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

关于c++ - 如何将 std::shared_ptr<Resource> 传递给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11445869/

相关文章:

c++ - 安全的、密码特定的 std::string 在解除分配时将自身归零

c++ - vector 排序/唯一/删除与复制到 unordered_set 的性能

c++ - 将 find_if 和 boost::bind 与一组共享指针一起使用

c++ - 对于具有 UIAccess ="true"的进程,CreateProcessAsUser 失败并显示 ERROR_ELEVATION_REQUIRED

c++ - 赋值运算符中的内存泄漏

c++ - RAII 和工厂设计模式?

c++ - 来自同一个 enable_shared_from_this 实例的两个 shared_ptr

c++ - 这个技巧是否会使在构造函数 'just work' 中调用 shared_from_this() 变得危险?

c++ - 写入内核配置时为 "Not a directory"

C++ 最令人头疼的解析又来了