关于创建 Stuff 并赋予 Foo 所有权,以下是否是一种合理且有效的方法?
class Foo
{
explicit Foo(const std::shared_ptr<Stuff>& myStuff)
: m_myStuff(myStuff)
{
}
...
private:
const std::shared_ptr<Stuff> m_myStuff;
}
std::shared_ptr<Stuff> foosStuff(new Stuff());
Foo f(foosStuff);
最佳答案
既然你对效率感兴趣,我想说明两点:
shared_ptr<> 是移动构造比复制构造成本更低的许多标准库类型之一。复制构造 shared_ptr 比较慢,因为复制需要引用计数器以原子方式递增,而移动 shared_ptr 根本不需要触及引用数据或计数器。从 Dave Abrahams 的文章“Want Speed? Pass by value!”中可以了解到,在某些情况下,按值获取函数参数实际上是有益的。这是其中一种情况:
class Foo
{
explicit Foo(std::shared_ptr<Stuff> myStuff)
: m_myStuff(move(myStuff))
{}
...
private:
std::shared_ptr<Stuff> m_myStuff;
};
现在你可以写了
Foo f (std::make_shared<Stuff>());
参数是临时的,没有复制 shared_ptr(只是移动了一两次)。
这里使用 std::make_shared 的好处是只完成一次分配。在您的情况下,您自己分配了 Stuff 对象,而 shared_ptr 构造函数也必须动态分配引用计数器和删除器。 make_shared 只需一次分配即可为您完成所有工作。
关于c++ - 将 std::shared_ptr 传递给构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12002480/