Должен ли std :: atomic <int *> :: load выполнять цикл сравнения и замены?

Резюме: Я ожидал, чтоstd::atomic::load сstd::memory_order_relaxed было бы близко к производительности простой загрузки указателя напрямую, по крайней мере, когда загруженное значение редко изменяется. Я видел гораздо худшую производительность для атомарной нагрузки, чем обычная загрузка в Visual Studio C ++ 2012, поэтому я решил исследовать. Оказывается, атомная нагрузка реализована в видесравнения и замены цикл, который я подозреваю, не самая быстрая реализация.

Вопрос: Есть ли какая-то причинаstd::atomic::load нужно сделать цикл сравнения и обмена?

Фон: Я считаю, что MSVC ++ 2012 выполняет цикл сравнения и замены при атомной загрузке указателя на основе этой тестовой программы:

#include 
#include 

template
__declspec(noinline) T loadRelaxed(const std::atomic& t) {
  return t.load(std::memory_order_relaxed);
}

int main() {
  int i = 42;
  char c = 42;
  std::atomic ptr(&i);
  std::atomic integer;
  std::atomic character;
  std::cout
    < *loadRelaxed(ptr) < ' '
    < loadRelaxed(integer) < ' '
    < loadRelaxed(character) < std::endl;
  return 0;
}

Ответы на вопрос(1)

Ваш ответ на вопрос