c++ 编译器可以合并原子存储吗?[副本]

mrphzbgm  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(114)

此问题已在此处有答案

Why don't compilers merge redundant std::atomic writes?(9个回答)
9天前关闭
下面的代码:

#include <atomic>

std::atomic_bool b;

void store2() {
    b.store(true, std::memory_order::relaxed);
    b.store(true, std::memory_order::relaxed);
}

GCC、MSVC和clang都发出两个mov,如下所示:

store2():
  mov     BYTE PTR b[rip], 1
  mov     BYTE PTR b[rip], 1
  ret
b:
  .zero   1

是否允许将这些原子存储合并为单个mov?我不相信如果其他线程同时观察到两个原子存储,就像它只是一个一样,这会违反std::memory_order::relaxed的限制。
如果允许的话,为什么编译器不执行这个简单的优化呢?

0lvr5msh

0lvr5msh1#

,这将是一个有效的转换。编译器do optimize some atomic operations,但修改编译器以执行此类优化是not trivial,因为正确实现它们的基本策略包括禁用优化,否则这些优化可能在内联后应用于它们。

相关问题