Move операция (например, перемещение конструктора) для std::shared_ptr
являются дешевыми, так как они в основном являются «угон указателей» (от источника к месту назначению, чтобы быть более точными, то весь блок государственного управления «украден» от источника к месту назначения, включая информацию о количестве ссылок).
Вместо копировать операций std::shared_ptr
вызова атомного ссылочного увеличения счета (т.е. не только ++RefCount
на члене числа RefCount
данных, но, например, вызывающий InterlockedIncrement
на Windows), который является более дорогой чем просто воруют указатели/состояние ,
Таким образом, анализируя динамику подсчета ссылок этого дела в деталях:
// shared_ptr<CompilerInvocation> sp;
compilerInstance.setInvocation(sp);
Если вы передаете sp
по значению, а затем взять копию внутри метода CompilerInstance::setInvocation
, у вас есть:
- При вводе метода параметр
shared_ptr
является копией: ref count atomicПриращение.
- Внутри тела метода, вы скопировать параметр
shared_ptr
в элемент данных: исх счета атомноеприращение.
- При выходе из метода разрушается параметр
shared_ptr
: ref count атомныйдекрет.
У вас есть две атомные приращения и один атомный декремент, в общей сложности три атомных операций.
Вместо этого, если вы передаете параметр shared_ptr
по значению, а затем std::move
внутри методы (как правильно сделано в коде звона в), у вас есть:
- При вводе методы параметр
shared_ptr
является копией построено: ref count atomicприрост.
- Внутри тела метода вы
std::move
параметр shared_ptr
в элемент данных: число обращений не изменение! Вы просто крадете указатели/состояние: не задействованы дорогостоящие операции с атомным числом.
- При выходе из метода параметр
shared_ptr
разрушен; но с тех пор, как вы перешли к шагу 2, разрушить нечего, поскольку параметр shared_ptr
больше не указывает на что-либо. Опять же, в этом случае атомный декремент не происходит.
Итог: в этом случае вы получите только один исх рассчитывать атомное приращение, то есть только один атомный операцию.
Как вы можете видеть, это гораздо лучше чем два атомных приращений плюс один атомный декремента (в общей сложности три атомарных операций) для случая копирования.
Это не преждевременная оптимизация? – YSC
@YSC нет, если кто-то положил его там, фактически протестировал его. – OrangeDog
@OrangeDog, конечно, глупо меня. – YSC