为什么宽松的原子操作会阻止编译器优化



C++编译器可以省略或组合分配。然而,如果分配的内存是用原子操作访问的(即使是用宽松的内存顺序(,那么GCC和Clang就不能消除分配。

// new/delete are elided
uint64_t successfulElision() {
auto ptr = new uint64_t{0};
*ptr = 5;
auto result = *ptr;
delete ptr;
return result;
}
// new/delete are not elided
uint64_t failedElision() {
auto ptr = new uint64_t{0};
atomic_ref<uint64_t> rf(*ptr);
rf.store(5, memory_order_relaxed);
auto result = rf.load(memory_order_relaxed);
delete ptr;
return result;
}

https://godbolt.org/z/sacMdbac5

这是什么原因?这是标准要求的吗?

您在某些函数中使用它,所以不能说它可能被优化了。如果用外部函数替换原子操作,则操作将相同:https://godbolt.org/z/GsYjrb6z5

相关内容

  • 没有找到相关文章

最新更新