小编典典

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

all

我一直在查看Clang
源代码
,发现了这个片段:

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;
}

阅读 76

收藏
2022-07-28

共1个答案

小编典典

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

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

通过移动shared_ptr而不是复制它,我们“窃取”了 原子 引用计数,并使另一个无效shared_ptr。“窃取”引用计数不是
原子shared_ptr的,它比复制(并导致 原子 引用递增或递减)快一百倍。

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

2022-07-28