代码之家  ›  专栏  ›  技术社区  ›  Iter Ator

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

  •  7
  • Iter Ator  · 技术社区  · 6 年前

    std::atomic<T> 具有 T 在某些情况下?

    我们走吧 std:shared_pointer 例如。它有一个原子计数器,但是如果只有一个线程可以访问它,它可以被一个简单的计数器替换,它的行为仍然像原子计数器一样。

    1 回复  |  直到 6 年前
        1
  •  1
  •   JVApen    6 年前

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

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

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

    实际上,如果您将指针或引用传递给另一个编译单元中的函数,编译器将无法进行优化。另一方面,如果编译器对使用情况有充分的了解,它可以得出这样的结论:不需要内存屏障,并在此基础上消除它们。

    消除另一端的记忆障碍是外发研究的一部分,所以你的研究可能不可用,或者可能只涵盖非常简单的案例。