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

2023-12-30

我一直在寻找铿锵源码 https://clang.llvm.org/doxygen/CompilerInstance_8cpp_source.html#l00069我发现了这个片段:

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

我为什么要std::move an std::shared_ptr?

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

为什么我不直接这样做呢?

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

我认为其他答案没有充分强调的一件事是speed.

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我要 std::move std::shared_ptr? 的相关文章

随机推荐