【发布时间】:2023-03-13 17:10:01
【问题描述】:
Visual C++ 中“volatile”的 MSDN 文档指出,写入具有“释放语义”,而读取具有“获取语义”,此外还确保读取始终从内存中读取,而写入始终相应地写入。
“volatile”的 C 规范包括第二部分(不要进行疯狂的优化),但不包括第一部分(内存栅栏)。
在 Visual C++ 中有没有什么方法可以只获得“C”易失性行为,而没有内存栅栏?
我想强制一个变量总是在堆栈上,在一个固定的位置,但我不想在每次分配给它时都承受内存栅栏的开销。
有没有什么简单的方法可以用 Visual C++ 源代码做到这一点?
【问题讨论】:
-
我认为第一部分不是标准 C++ 行为。不过我不确定。
-
“我想强制一个变量总是在堆栈上,在一个固定的位置”,
volatile将如何帮助? FWIW,变量总是在一个固定的位置。 @Nawaz:不,第一部分不标准。 -
@Fernades 局部变量并不总是在一个固定的位置。可以消除局部变量,或者它们在堆栈上的地址可以位于不同的位置,具体取决于 PC 的位置。优化器可以做很多疯狂的事情。我想抑制这些优化。做到这一点的方法是使用“易失性”。但是,我不想要 Visual C++ 引入的非标准内存栅栏。
-
编辑为(希望)清楚地表明这是特定于 MS 的行为。实际上我认为它只适用于 Visual C++ 2005 及更高版本。
-
@ScottWisniewski:它更有可能有时在堆栈上,有时在寄存器中,而不是堆栈上的两个不同位置。但你肯定有道理。
标签: c++ visual-c++ volatile