此问题已在此处有答案:
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
- 参见live demo*
是否允许将这些原子存储合并为单个mov
?我不相信如果其他线程同时观察到两个原子存储,就像它只是一个一样,这会违反std::memory_order::relaxed
的限制。
如果允许的话,为什么编译器不执行这个简单的优化呢?
1条答案
按热度按时间0lvr5msh1#
是,这将是一个有效的转换。编译器do optimize some atomic operations,但修改编译器以执行此类优化是not trivial,因为正确实现它们的基本策略包括禁用优化,否则这些优化可能在内联后应用于它们。