通过引用传递 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
。
让我们看看您的函数。对于 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"。
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
。
让我们看看您的函数。对于 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"。