这些是否允许在 C++ 中进行优化?

Are these allowed optimizations in C++?

std::atomic<std::int64_t> num{0};在代码的某处accessible/visible定义。 是否允许 C++ 编译器将以下两个代码中的每一个替换为空代码(什么都不做)?同样,这些优化是否允许在运行时发生? 我只是想更好地了解事情的运作方式。

num.fetch_add(1,std::memory_order_relaxed);
num.fetch_sub(1,std::memory_order_relaxed);

num.fetch_add(1,std::memory_order_relaxed);
std::this_thread::yield();
num.fetch_sub(1,std::memory_order_relaxed);

我认为理论上是的,甚至 yield 也无济于事。

但实际上没有不是今天,但将来可能。

参见:

如果合并修改,可能会发生

"Runtime optimization"。我不知道这种情况在实践中是否会发生。反正跟"no other threads manage to observe modified value before it changes back"

区别不大

其实无论是编译器优化,还是运行时,优化效果都等同于"no other threads manage to observe modified value before it changes back"。产量不能保证有帮助,至少因为它只是 "gives opportunity to reschedule",实现可能会决定忽略它。理论上 yield 和原子操作之间没有同步。

另一方面,您希望通过此实现什么?