简而言之,volatile
所有语义都依赖于平台/编译器.在某些编译器(如具有IA64体系结构的MSVC)上,volatile
关键字不仅可以防止编译器重新排序操作,还可以使用获取/释放语义执行每个读/写操作,这意味着存在有效的内存屏障操作.另一方面,GCC仅阻止编译器在读取/写入易失性存储器位置之前/之后重新排序操作...在具有弱存储器模型的平台上,获取释放语义不像它们那样维护MSVC.
现在在x86上,因为其严格排序的内存模型,从使用的内存屏障存在volatile
的关键字不是问题,所以主要的罚款仅仅是缺乏重新排序和其它优化可以执行由编译器.话虽如此,它将取决于您的代码是什么样的.举例来说,如果你在你的代码,和某些紧密环volatile
-qualified变量实际上是循环不变,你不会得到一些优化,如果这些内存位置被认定为不可编译器可以做volatile
.