移动 std::shared_ptr 的函数声明
Function declaration for moving std::shared_ptr
对于按值传递共享指针还是按引用传递共享指针,几乎没有好的答案。但是,我没有找到关于 'moving' 共享指针的最佳实践的答案。
我的函数有一个指向对象的共享指针,但它不想保留。据我了解,移动它是性能方面的最佳选择,因为我们可以跳过增加然后立即减少引用计数的步骤。但是,我不清楚这两个声明之间是否存在差异:
调用函数
foo(std::move(sourcePtr));
声明应该是
选项 1
void foo(std::shared_ptr<X> x);
或选项 2
void foo(std::shared_ptr<X>&& x);
值得注意的是,std::move
实际上并没有对对象执行move,它只是将对象转换为右值(xvalue)。
那么对于第一种情况,参数x
将从sourcePtr
移动构造。之后 sourcePtr
的托管指针将为空。
对于第二种情况,没有std::shared_ptr
被构造; x
是一个右值引用并绑定到 sourcePtr
。那么会发生什么取决于 foo()
的实现,并且 sourcePtr
不会被移动,直到你通过 x
在 foo()
中执行它,例如std::shared_ptr<X> new_x = std::move(x);
.
对于按值传递共享指针还是按引用传递共享指针,几乎没有好的答案。但是,我没有找到关于 'moving' 共享指针的最佳实践的答案。
我的函数有一个指向对象的共享指针,但它不想保留。据我了解,移动它是性能方面的最佳选择,因为我们可以跳过增加然后立即减少引用计数的步骤。但是,我不清楚这两个声明之间是否存在差异:
调用函数
foo(std::move(sourcePtr));
声明应该是
选项 1
void foo(std::shared_ptr<X> x);
或选项 2
void foo(std::shared_ptr<X>&& x);
值得注意的是,std::move
实际上并没有对对象执行move,它只是将对象转换为右值(xvalue)。
那么对于第一种情况,参数x
将从sourcePtr
移动构造。之后 sourcePtr
的托管指针将为空。
对于第二种情况,没有std::shared_ptr
被构造; x
是一个右值引用并绑定到 sourcePtr
。那么会发生什么取决于 foo()
的实现,并且 sourcePtr
不会被移动,直到你通过 x
在 foo()
中执行它,例如std::shared_ptr<X> new_x = std::move(x);
.