Используют ли совместно используемые указатели атомарные операции для подсчета ссылок даже в однопоточной программе - PullRequest
0 голосов
/ 22 марта 2019

Чтобы быть многопоточным, std :: shared_ptr использует атомарные операции для подсчета ссылок. Хотя это хорошо, у меня есть следующие вопросы:

  1. Если программа однопоточная, существует ли достаточно умный компилятор, чтобы вместо этого использовать простые (неатомарные) операции увеличения и уменьшения?
  2. После ответа на поставленный выше вопрос, если ответ отрицательный, есть ли способ сообщить компилятору, что его программа однопоточная, так что не беспокойтесь об использовании атомарных операций при его компиляции?

1 Ответ

0 голосов
/ 22 марта 2019
  1. Это будет зависеть от компилятора. Visual Studio 2017 недостаточно умна. Я не могу сказать, что будет делать Clang (я не использую их ежедневно), но держу пари, что они не настолько умны. Как отметил @yachoor в комментарии, «g ++ в Linux достаточно умен - он не использует атомарные операции для std :: shared_ptr, если программа не связана с pthread»

  2. Не уверен, но стандартного способа сделать это не существует. Посмотрите на это. Вы можете использовать оператор std :: move, чтобы ссылка не увеличивалась. Если это не так, я думаю, что нет простого способа сделать это.

Относительно пункта 2 есть и другие возможности. Вы можете извлечь указатель на этот объект и передать его как ссылку везде, где это необходимо в вашей программе. Поскольку он однопоточный, вы должны быть почти уверены в сроке службы этого объекта. В противном случае вы можете переосмыслить свое владение памятью.

...