Visual C++ 中“易失性”的 MSDN 文档表明,除了确保读取始终从内存中读取以及写入始终相应地写入之外,写入具有“释放语义”,读取具有“获取语义”。
“易失性”的 C 规范包括第二部分(不要进行疯狂的优化),但不包括第一部分(内存栅栏)。
Visual C++ 中是否有任何方法可以仅获得“C”易失性行为,而无需内存栅栏?
我想强制一个变量始终位于堆栈上的固定位置,但我不想在每次对其进行赋值时占用内存栅栏的开销。
有没有简单的方法可以使用 Visual C++ 源代码来做到这一点?
Visual C++ 中是否有任何方法可以仅获得“C”易失性行为,而无需内存栅栏?
在 x86 上,在读取和写入时不会在程序集级别创建内存栅栏。volatile
内存位置,因为在该平台上每个加载都有获取语义,每个存储都有释放语义。因此,对于 x86 上的 MSVC,volatile
指令只是指示编译器防止加载和存储的重新排序,具体取决于您是从标记的内存位置写入还是读取volatile
.
在 IA64 架构上,您只会遭受内存栅栏的“惩罚”,因为该平台的内存排序模型不能确保加载和存储的获取和释放语义。
请记住,此行为是 MSVC 特定的,而不是标准化语义volatile
.
Update:根据 @ildjarn 的说法,您还会在 Windows 8 的 ARM 上看到内存栅栏,因为该平台也有像 IA64 这样的弱有序内存一致性模型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)