让我们考虑一下这个简单的代码:
#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(请参见生成的代码here)
实际上,我希望此代码可以生成易失性原子:
volatile std::atomic<int> va;
void g(){
for(int k=0;k<100;++k)
va.load(std::memory_order_relaxed);
}
为什么编译器不能优化不必要的原子负载?