使用relaxed memory order,例如对于引用计数指针,是否允许编译器优化掉后续的递增和递减?
std::atomic_int32_t ai;
for (size_t i = 0; i < 10000; i++)
{
ai.fetch_add(1, std::memory_order_relaxed);
ai.fetch_sub(1, std::memory_order_relaxed);
}
看看反汇编看起来不像。但是由于允许重新排序并且atomic
表现得像一个计数器,只是线程安全,可以说他可以优化,好像它是一个普通的int。
答案 0 :(得分:4)
我相信它可以被优化,除非声明为volatile。原因是对于任何在其间交错某些线程的调度,存在没有的有效调度。我相信drf-sc内存模型也是如此。
如果这个线程在两者之间读取内容,则不会是这种情况。
答案 1 :(得分:-3)
编译器无法优化原子,因为这会违反它们的原因。它必须假设另一个线程也可能触及该值,因此不允许删除。
它也无法优化/重新排序“可见”的内容。因为原子是内存障碍所以从前到后(以及其他方式)的C ++代码。