通过引用或按值将共享指针作为参数传递给 class
Passing a shared pointer by reference or by value as parameter to a class
如果要将共享指针复制到成员变量,它应该通过引用还是通过值作为参数传递给 class?
共享指针的复制会增加引用计数,我不想进行任何不必要的复制,从而增加引用计数。将共享指针作为参考传递可以解决这个问题吗?我想是的,但是还有其他问题吗?
按值传递:
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);
}
shared_ptr 在传递给函数时应该像对待任何其他 class 一样对待。
在这种情况下,您应该传递给常量引用。
为什么我写 为什么我写 Herb Sutter 跳到最小值 21:50
https://www.youtube.com/watch?v=xnqTKD8uD64
按值传递然后将其移动到成员中:
class Foo {
public:
Foo(std::shared_ptr<Boo> boo)
: m_Boo(std::move(boo)) {}
private:
std::shared_ptr<Boo> m_Boo;
};
这在所有情况下都是最有效的 - 如果调用者有一个 rvalue-reference 则不会有单个 add-ref,如果调用者有一个值则只有一个 add-ref.
如果您通过 const&
,即使在不必要的情况下,您也会强制执行 add-ref。如果您按值传递然后在没有 std::move
的情况下进行设置,您可能会得到 2 add-refs.
编辑:如果你有一个 class 移动比复制便宜得多,并且你有一个函数调用,它总是复制传入的实例,那么这是一个很好的模式 -就像在这种情况下一样。您通过按值获取它来强制在函数调用边界发生复制,然后如果调用者有右值引用,则根本不需要复制 - 它会被移动。
如果要将共享指针复制到成员变量,它应该通过引用还是通过值作为参数传递给 class?
共享指针的复制会增加引用计数,我不想进行任何不必要的复制,从而增加引用计数。将共享指针作为参考传递可以解决这个问题吗?我想是的,但是还有其他问题吗?
按值传递:
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);
}
shared_ptr 在传递给函数时应该像对待任何其他 class 一样对待。 在这种情况下,您应该传递给常量引用。
为什么我写 为什么我写 Herb Sutter 跳到最小值 21:50 https://www.youtube.com/watch?v=xnqTKD8uD64
按值传递然后将其移动到成员中:
class Foo {
public:
Foo(std::shared_ptr<Boo> boo)
: m_Boo(std::move(boo)) {}
private:
std::shared_ptr<Boo> m_Boo;
};
这在所有情况下都是最有效的 - 如果调用者有一个 rvalue-reference 则不会有单个 add-ref,如果调用者有一个值则只有一个 add-ref.
如果您通过 const&
,即使在不必要的情况下,您也会强制执行 add-ref。如果您按值传递然后在没有 std::move
的情况下进行设置,您可能会得到 2 add-refs.
编辑:如果你有一个 class 移动比复制便宜得多,并且你有一个函数调用,它总是复制传入的实例,那么这是一个很好的模式 -就像在这种情况下一样。您通过按值获取它来强制在函数调用边界发生复制,然后如果调用者有右值引用,则根本不需要复制 - 它会被移动。