В своем Blog Herb Sutter пишет
[...], потому что увеличивает счетчик ссылок на интеллектуальные указателиобычно можно оптимизировать так же, как обычный прирост в оптимизированной реализации
shared_ptr
- просто обычная инструкция приращения, и никаких заграждений в сгенерированном коде.Однако декремент должен быть атомным декрементом или эквивалентным, который генерирует специальные инструкции памяти процессора, которые стоят дороже сами по себе, и что, помимо того, что индуцирует память ограничения ограждения для оптимизации окружающего кода.
Текст посвящен реализации shared_ptr
, и я не уверен, что его замечание относится только к этому или, как правило, к делу. Из его формулировки я понимаю, что это вообще.
Но когда я думаю об этом, я могу только думать о "более дорогом декременте", когда сразу следует if(counter==0)
, что, вероятно, имеет место с shared_ptr
.
Поэтому я задаюсь вопросом, является ли атомная операция ++counter
(обычно) всегда быстрее чем --counter
, или просто потому, что используется if(--counter==0)...
с shared_ptr
?