c++ - 将 std::shared_ptr 传递给构造函数

标签 c++ std

关于创建 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/

相关文章:

c++ - 使用模板来克服缺少基类的问题?

c++ - std::transform 到任意容器

c++ - C++ 标准容器的线程安全

c++ - 无法解析符号哈希

c++ - 在 boost R 树中存储原始指针时出现问题

c++ - QTableview 属性

c++ - 使用基于范围的 for 循环遍历指针列表

c++ - 为什么右值 STL 容器中的元素 getter 返回左值?

c++ - 我应该在 Xcode 的什么地方定义 DISALLOW_COPY_AND_ASSIGN 宏

c++ - 更改入口点(main()函数)的目的是什么