c++ - 为什么我要 std::move 一个 std::shared_ptr?

标签 c++ c++11 shared-ptr smart-pointers move-semantics

我一直在看Clang source code我发现了这个片段:

void CompilerInstance::setInvocation(
    std::shared_ptr<CompilerInvocation> Value) {
  Invocation = std::move(Value);
}

我为什么要std::move 一个std::shared_ptr

转让共享资源的所有权有什么意义吗?

我为什么不这样做呢?

void CompilerInstance::setInvocation(
    std::shared_ptr<CompilerInvocation> Value) {
  Invocation = Value;
}

最佳答案

我认为其他答案没有足够强调的一件事是速度

std::shared_ptr 引用计数是原子。增加或减少引用计数需要原子递增或递减。这比 non-atomic 递增/递减百倍,更不用说如果我们递增和递减同一个计数器,我们最终会得到准确的数字,浪费了一吨过程中的时间和资源。

通过 move shared_ptr 而不是复制它,我们“窃取”了 atomic 引用计数,并使其他 shared_ptr 无效。 “窃取”引用计数不是 atomic,它比复制 shared_ptr 快一百倍(并导致 atomic 引用递增或递减) .

请注意,此技术纯粹用于优化。复制它(如您所建议的)在功能方面同样出色。

关于c++ - 为什么我要 std::move 一个 std::shared_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41871115/

相关文章:

c++ - 是否可以将大括号括起来的初始化程序作为宏参数传递?

c++ - 如何编写可以在 msdos 上运行的 C++ 控制台 exe?

c++ - 如何遍历...args(可变长度模板参数)

c++ - 来自多项式类型的数字类型

c++ - 仅适用于智能指针的模板

c++ - 编译错误 std::vector<std::shared_ptr<T>> 迭代器和删除方法

c++ - 在 C++ 中保持对象持久化?

c++ - 基于空终止字符串的for循环范围

c++ - 用随机数填充多个 vector

c++ - shared_ptr 不报告引用对象删除