Давайте рассмотрим этот тривиальный код:
#include <atomic>
std::atomic<int> a;
void f(){
for(int k=0;k<100;++k)
a.load(std::memory_order_relaxed);
}
MSVC, Clang и GCC все выполняют 100 загрузок, хотя кажется очевидным, что его можно было бы оптимизировать. Я ожидал, что функция f
будет nop (см. Сгенерированный код здесь )
На самом деле, я ожидал, что это генерирование кода для изменчивого атома:
volatile std::atomic<int> va;
void g(){
for(int k=0;k<100;++k)
va.load(std::memory_order_relaxed);
}
Почему компиляторы не оптимизируют ненужные атомарные нагрузки?