【发布时间】:2018-11-26 00:15:06
【问题描述】:
如果我声明一个仅在单个线程中使用的原子变量,编译器是否能够对其进行优化,并在某些情况下将 std::atomic<T> 替换为 T?
我读过一些关于 atimics 的编译器优化的文章,但它们大多是关于对锁和存储进行重新排序和分组,而不是关于消除它们。
我们以std:shared_pointer 为例。它有一个原子计数器,但如果只有一个线程可以访问它,它可以被一个简单的计数器替换,它仍然会表现得好像它是一个原子的。
【问题讨论】:
-
取决于情况和编译器的糟糕程度。但通常,由于“原子”在许多情况下意味着“易变”,所以不是。
-
在这种情况下,有时:godbolt.org/g/64o5v3 - 我还没有找到 有趣的 案例(肯定没有 shared_ptr 这么复杂)
-
@david: atomic 和 volotile 之间没有联系,除了过去的误用
-
@JVApen 原子访问中的无链接不是易失性访问,但在实践中存在很多重叠。值得注意的是,消费语义是可变语义(几乎)。
标签: c++ multithreading c++11 atomic compiler-optimization