如果要将共享指针复制到成员变量,则应该通过引用或将值作为参数传递给类?

共享指针的复制将增加引用计数,并且我不想进行任何不必要的复制,因此引用计数会增加。将共享指针作为引用传递可以解决此问题吗?我认为可以,但是还有其他问题吗?

通过值传递:

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/

10-10 13:20
查看更多