如果要将共享指针复制到成员变量,则应该通过引用或将值作为参数传递给类?
共享指针的复制将增加引用计数,并且我不想进行任何不必要的复制,因此引用计数会增加。将共享指针作为引用传递可以解决此问题吗?我认为可以,但是还有其他问题吗?
通过值传递:
class Boo {
public:
Boo() { }
};
class Foo {
public:
Foo(std::shared_ptr<Boo> boo)
: m_Boo(boo) {}
private:
std::shared_ptr<Boo> m_Boo;
};
int main() {
std::shared_ptr<Boo> boo = std::make_shared<Boo>();
Foo foo(boo);
}
透过路过:
class Boo {
public:
Boo() { }
};
class Foo {
public:
Foo(std::shared_ptr<Boo>& boo)
: m_Boo(boo) {}
private:
std::shared_ptr<Boo> m_Boo;
};
int main() {
std::shared_ptr<Boo> boo = std::make_shared<Boo>();
Foo foo(boo);
}
最佳答案
通过值传递它,然后将其移动到成员中:
class Foo {
public:
Foo(std::shared_ptr<Boo> boo)
: m_Boo(std::move(boo)) {}
private:
std::shared_ptr<Boo> m_Boo;
};
这在所有情况下都是最有效的-如果调用方具有右值引用,则不会有单个add-ref;如果调用方具有值,则只会有单个add-ref。
如果您通过
const&
传递,即使在不必要的情况下也要强制添加引用。如果按值传递,但未设置std::move
,则可能会获得2个添加引用。编辑:如果您拥有一个类,其移动比复制便宜得多,并且您具有一个函数调用,该函数将始终复制传入的实例,则这是一个很好的模式-在这种情况下。您可以通过按值取值来使拷贝发生在函数调用边界,然后,如果调用方具有右值引用,则根本不需要复制该拷贝,而是将其移动。
关于c++ - 通过引用或按值将共享指针作为参数传递给类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49776400/