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

 

问题描述:

我一直在查看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;
}

 

第 1 个答案:

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

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

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

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


我遇到了 emulator-5554 的问题,它一直告诉我它处于离线状态。当我adb devices从命令行执行时,它说emulator-5554 offline即使重新启动后,我尝试了该命 ...