在VS2012中使用'volatile'关键字的最佳做法

时间:2013-05-02 14:37:46

标签: c++ visual-c++ visual-studio-2012 c++11

自从我们的开发和构建环境从VS2008升级到VS2012以来,我对在我们的遗留代码库中使用volatile关键字的含义感到困惑(这是非常广泛的,因为有很多复制模式来管理来自“旧”日子。

Microsoft在VS2012文档中有以下评论:

  

如果您熟悉C# volatile 关键字,或熟悉早期版本的Visual C ++中 volatile 的行为,请注意C ++ 11 ISO标准 volatile 关键字不同,并且在指定/volatile:iso编译器选项时在Visual Studio中受支持。 (对于ARM,默认情况下指定)。 C ++ 11 ISO标准代码中的 volatile 关键字仅用于硬件访问;不要将它用于线程间通信。对于线程间通信,请使用C ++标准模板库中的std::atomic<T>等机制。

接着说:

  

当使用/volatile:ms编译器选项时 - 默认情况下,当ARM以外的体系结构成为目标时 - 除了维护对其他全局对象的引用的排序之外,编译器还会生成额外的代码来维护对volatile对象的引用之间的排序。

我认为这意味着我们现有的代码不会破坏,但不一定是可移植的(对我们来说不是问题)。

然而,如果可能的话,它确实提出了这些问题,我希望得到一些建议:

  1. 我们是否应该在我们的代码中删除volatile限定符的使用,并替换为符合C ++ 11 ISO标准的等价物,即使我们不会将代码从MS中移除?
  2. 如果我们不这样做,是否有任何缺点?
  3. 我理解这不是一个特定的编程问题,但我们正在进行一些非常重要的重构,我希望能够为这项工作提供一些合理的指导。

1 个答案:

答案 0 :(得分:6)

  1. 如果你有时间的话。好处并不是那么好--C ++ 11原子可能允许更准确地控制您需要的同步类型,并且具有更明确定义的语义,这可以使编译器更好地优化代码。
  2. 从理论上讲,但非常不太可能,未来版本的编译器可能会完全放弃对MS风格的volatile的支持。或者有一天你实际上想要远离MS编译器,即使你留在Windows上也是如此。如果你现在正在进行重构,那么现在可能是用原子来替换挥发物的工作的好时机,这样你就可以避免在将来做这项工作。