编译器是否消除了不必要的原子?

Ite*_*tor 7 c++ multithreading atomic compiler-optimization c++11

如果我宣布一个原子变量,这是只有在一个线程中使用,是编译器能够优化了这一点,并更换std::atomic<T>T在某些情况下?

我已经阅读了一些关于激励的编译器优化的文章,但它们主要是关于锁和存储的重新排序和分组,而不是关于消除它们.

我们std:shared_pointer举个例子.它有一个原子计数器,但如果只有一个线程可以访问它,它可以用一个简单的计数器代替,它仍然会表现得好像是一个原子.

JVA*_*pen 1

答案取决于您对原子优化的假设。使用原子有两个效果:强制执行语句的可观察顺序并确保处理器缓存失效。

如果您使用的是英特尔处理器,则大多数后者都可以简单地删除。这是因为处理器保证相同的行为并且不需要进行特定处理。

然而对于订购,却有不同的故事。为了消除排序限制,您的编译器应该能够证明您没有不同的可观察行为。

实际上,如果您将指针或引用传递给不同编译单元中的函数,编译器将无法进行优化。另一方面,如果编译器对使用情况有完全的可见性,它可能会得出结论:不需要内存屏障,并据此消除它们。

解决代码生成的问题是很容易解决的问题,据我所知,大多数行业编译器至少对此有一些支持。消除另一端的内存障碍是正在进行的研究的一部分,因此这可能不可用,或者可能只涵盖非常简单的情况。

当你问这个问题时,认为你更了解你的用例可能听起来是合理的。但是,我建议当您需要原子行为时保留原子。手动优化非常耗时,而且好处可能并不明显。