我一直在查看 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;
}
原文由 sdgfsdh 发布,翻译遵循 CC BY-SA 4.0 许可协议
我认为其他答案没有足够强调的一件事是 _速度_。
std::shared_ptr
引用计数是 原子 的。增加或减少引用计数 需要 原子 增量或减量。这比 非原子 递增/递减 慢 了一百倍,更不用说如果我们递增和递减同一个计数器,我们最终会得到确切的数字,在这个过程中浪费了大量的时间和资源。通过移动
shared_ptr
而不是复制它,我们“窃取”了 原子 引用计数,并使另一个shared_ptr
无效。 “窃取”引用计数不是 原子 的,它比复制shared_ptr
快一百倍(并导致 原子 引用递增或递减)。请注意,此技术纯粹用于优化。复制它(如您所建议的)在功能方面同样出色。