InterlockedIncrement和其他Interlocked操作将其参数声明为volatile。为什么?这是什么意图和影响?
答案 0 :(得分:9)
可能的影响很小。最可能的意图是允许用户将volatile
- 限定变量传递给这些函数,而无需进行类型转换。
答案 1 :(得分:4)
这样做是为了可以在正常变量和volatile变量上调用该函数。您不能将volatile变量传递给不期望volatile参数的函数。以下代码无法编译(使用Visual Studio 2005 C ++编译器测试):
void TestV(int *a)
{
*a = 1;
}
void Test()
{
volatile int a = 0;
TestV(&a);
}
声明就是这样,您可以执行以下操作:
volatile LONG a = 0;
InterlockedIncrement(&a);
因为它很可能在volatile变量上调用InterlockedIncrement,所以将它声明为这样是明智的。
答案 2 :(得分:-1)
volatile参数阻止编译器进行阻止读取内存的优化。只要代码的可见效果相同,编译器就可以进行它喜欢的任何优化,但这些效果在多线程场景中不被考虑,只能从单个线程中考虑。 volatile关键字告诉编译器这个变量可以被修改或从外部的,不可知的源读取,编译器无法摆脱它或者对它进行内存访问。
答案 3 :(得分:-2)
简而言之,volatile意味着“此变量可能会在此程序之外修改”。
换句话说,这意味着变量的值可以在代码中没有任何相关指令的情况下更改。例如,它通常用于低级I / O,其中寄存器或缓冲区的值可以由硬件设置。