通过引用传递 shared_ptr 比直接通过引用传递有什么优势

What is the advantage of passing by reference to shared_ptr over passing by reference directly

class myMem{};

class Test{
public:
  initMem1(myMem& mInput){/*initialize _mem1*/}
  initMem2(shared_ptr<myMem> &pmInput){/*initialize _mem2*/}

  myMem _mem1;
  shared_ptr<myMem> _mem2;
};

Test myTest;
myTest()

所以,在上面的代码中,成员属于class。一个成员是值类型,另一个成员是 shared_ptr 类型。 class 会员哪种方式更好?此外,我还有初始化成员的功能。哪种方式更好?

一般来说,通过引用传递给 shared_ptr 比直接通过引用传递有什么优势?

一个用例是原始 shared_ptr 可以在函数中间更改其内容(可能是嵌套调用)并且函数已准备好并需要新内容。

函数应该接受 std::shared_ptr 作为参数的 唯一 原因是它可能需要共享或修改 所有权 的资源。如果不是,请不要传递 std::shared_ptr.

如果函数 肯定 需要共享所有权,那么它应该按值接受 std::shared_ptr。如果函数可能会或可能不会共享所有权,则只接受 std::shared_ptr&

如果函数不修改 ownership,则将 reference 传递给资源,而不是 std::shared_ptr

参见: CppCore 指南: F.7, R.30, R.34, R.35

让我们看看您的函数。对于 initmem1,代码通常看起来像

initMem1(myMem& mInput){ _mem1 = mInput; }

我们可以看到一个赋值运算符的调用,它通常会复制所有myMem字段。

对于initMem2,有两种情况

1)

initMem2(shared_ptr<myMem> &pmInput){
     _mem2 = pmInput;
 }

你应该使用 'initMem2(const shared_ptr &pmInput)'。这是一个很好的风格。 我们可以在这里看到快速初始化。只是链接被复制。但是你得到所有权共享。如果您在外部更改 pmInput,那么 _mem2 也会更改。 不需要复制构造函数。两个智能指针都持有唯一对象。

2)

initMem2(const shared_ptr<myMem> &pmInput){ // of course, const
     _mem2.reset(*pmInput);
 }

您使用最初从 pmInput 复制的新内容创建了一个新的 shared_ptr。 您可以独立更改 pmInput_mem2。但是对于这个新的 shared_ptr 和复制构造函数调用,你会得到额外的 "new/delete calls"。