c++ - 复制或 constref 一个 shared_ptr?

标签 c++ performance shared-ptr dereference

考虑一些数据源,它包含一个 shared_ptr(例如一个结构成员)。如果您保证它不是临时值,但在当前范围内有效,并且您想要该指针的别名:性能更高的方法是复制 shared_ptr 或使用 (可能是 const) 对原始文件的引用?

例子:

struct S {
  shared_ptr<T> ptr;
};

void fun(S s) {
  shared_ptr<T> alias1 = s.ptr;
  shared_ptr<T> const& alias2 = s.ptr;
  /* do something with the alias */
}

编辑:动机。这可能是必要的,例如1) 获取 s.ptr 涉及遍历函数调用链或 derefs 或 2) 想要提高可读性。

权衡。复制指针感觉更“正确”,因为它模仿了你对原始指针所做的事情,但它需要引用计数机制来完成它的事情(在构建和销毁时) ).另一方面,拥有一个您可能经常使用的引用会导致额外的取消引用,这反过来又很昂贵(取消引用是您对持有的 T 对象所做的任何事情之上的)。

是否有一个共同的经验法则,什么是更高性能的?

最佳答案

经验法则

在不取得所有权的情况下修改或操作数据的算法应该作用于迭代器或对数据(或其容器)的引用。

例如,如果你想找到一堆值的平均值,你应该编写一个函数,将迭代器带到值集(或通过 const 引用获取容器)。您不应该 做的是通过拷贝传递 vector ,或传递智能指针。

复制 shared_ptr 会产生开销,并且算法本身应该始终期望它们操作的数据比计算更有效。

何时使用shared_ptr shared_ptr 应该在编写容器或其他需要保留一段数据的类时使用一段未知的时间。对象拥有所有权,而不是函数,也不是算法。 (当然,成员函数可以接受 shared_ptr 作为输入,但只有在它们所属的类需要拥有该数据时才有意义)。

线程呢?

线程是这个经验法则的异常(exception)。如果您开始一个新线程,您绝对应该按值传递任何 shared_ptr。线程可能会存活一段未知的时间,您需要确保它可以访问的任何数据在线程退出之前都保持有效。

无论如何,复制一个shared_ptr 比启动一个线程便宜很多,所以它的开销是最小的。

关于c++ - 复制或 constref 一个 shared_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55857534/

相关文章:

c++ - 请求从 ‘Point*’ 到非标量类型 ‘Point’ 的转换

c++ - 在循环 C++ 中更改列表的值

c++ - 如何使用 shared_ptr 在类型删除类中显示基础数据

c++ - 哪些库对 std::make_shared 使用了 "We Know Where You Live"优化?

C++ 'AND' 评估 - 标准有保证吗?

c++ - 一个奇怪的 C++ 结构的引用成员

java - "App isn' t 响应“一旦启动应用程序

string - SWIFT:大写字符串的性能

database - 强规范化关系数据库效率不高?

c++11 - C++ 在 std::shared_ptr<baseclass> 中使用派生类