2011-09-21 71 views
8

在Visual C++中,“volatile”的MSDN文档指出写入具有“释放语义”,并且读取具有“获取语义”,此外还确保读取始终从内存中读取,并且写入始终相应写入。Visual C++挥发性

“volatile”的C规范包括第二部分(不要疯狂优化),但不包括第一部分(内存围栏)。

是否有任何方式在Visual C++获得“C”易失性行为,没有内存围栏?

我想强制一个变量总是在堆栈中,在一个固定的位置,但我不想在每个分配上都占用内存栏的开销。

是否有任何简单的方法来做到这一点与Visual C++源?

+0

第一部分不是标准C++行为,我认为。不过,我不确定。 – Nawaz

+0

“我想迫使一个变量总是在堆栈中,在一个固定的位置”,而volatile将如何帮助它? FWIW,变量总是*在固定点。 @Nawaz:不,第一部分不是标准。 –

+1

@Fernades局部变量并不总是在一个固定的位置。取决于PC的位置,局部变量可以被消除,或者它们的地址在不同的地方。优化器可以做很多疯狂的事情。我想压制这些优化。要做到这一点的方法是使用“易失性”。但是,我不希望Visual C++引入的非标准内存围栏编辑为 –

回答

4

有没有什么办法在Visual C++获得“C”易失性行为,没有内存围栏?

在x86上有在组件级别创建无记忆栅栏上读取并自该平台每个负载具有收购语义上写入到volatile存储位置,每家店都有释放语义。因此,对于x86上的MSVC,volatile指令只是指示编译器防止加载和存储的重新排序,具体取决于您是从标记为volatile的内存位置进行写入还是读取。

由于平台的内存排序模型不能确保加载和存储的获取和释放语义,因此您只会在IA64体系结构上产生内存栅栏的“惩罚”。

请记住,此行为是MSVC特有的,并不是volatile的标准化语义。

更新:根据@ildjarn,你会在ARM上看到Windows 8的内存围栏,因为该平台也有IA64这样的弱顺序内存一致性模型。

+0

罚款也适用于ARM。 – ildjarn

+0

MSVC可以在ARM上工作吗? ......我不知道你可以在ARM上运行Windows程序...... – Jason

+0

ARM是Windows 8的主要平台,所以MSVC11也支持ARM作为主要架构。 – ildjarn