Sco*_*ski 8 c++ volatile visual-c++
Visual C++中"volatile"的MSDN文档表明,写入具有"释放语义",并且读取具有"获取语义",此外还确保读取始终从内存中读取,并且写入总是相应地写入.
"volatile"的C规范包括第二部分(不做疯狂的优化),但不包括第一部分(内存栅栏).
在没有内存栅栏的情况下,Visual C++中是否有任何方法只能获得"C"易变行为?
我想强制一个变量始终在堆栈上,在一个固定的位置,但我不想在每次赋值时占用内存栅栏的开销.
有没有简单的方法来使用Visual C++源代码?
Visual C++ 中是否有任何方法可以仅获得“C”易失性行为,而无需内存栅栏?
在 x86 上,在读取和写入内存位置时,不会在程序集级别创建内存栅栏,volatile因为在该平台上,每个加载都具有获取语义,并且每个存储都具有释放语义。因此,对于 x86 上的 MSVC,该volatile指令只是指示编译器防止加载和存储重新排序,具体取决于您是从标记为 的内存位置写入还是读取volatile。
在 IA64 架构上,您只会遭受内存栅栏的“惩罚”,因为该平台的内存排序模型不能确保加载和存储的获取和释放语义。
请记住,此行为是 MSVC 特定的,而不是volatile.
更新:根据 @ildjarn 的说法,您还会在 Windows 8 的 ARM 上看到内存栅栏,因为该平台也有像 IA64 这样的弱有序内存一致性模型。