为什么我要 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即使重新启动后,我尝试了该命 ...