【问题标题】:What is the effect of InterlockedIncrement argument declared as volatileInterlockedIncrement 参数声明为 volatile 的效果是什么
【发布时间】:2011-06-29 04:37:24
【问题描述】:

InterlockedIncrement 和其他 Interlocked 操作将其参数声明为 volatile。为什么?这样做的目的和作用是什么?

【问题讨论】:

标签: c++ c winapi volatile


【解决方案1】:

可能的影响非常小。最可能的意图是允许用户将volatile-qualified 变量传递给这些函数,而无需进行类型转换。

【讨论】:

  • “效果非常小”.. 你到底是什么意思?想提一下参考资料吗?
【解决方案2】:

这样做是为了使函数既可以在普通变量上调用,也可以在易失性变量上调用。您不能将 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 很可能有意义,因此将其声明为这样似乎是明智的。

【讨论】:

    【解决方案3】:

    volatile 参数可防止编译器进行阻止读取内存的优化。只要代码的可见效果相同,编译器就可以进行它喜欢的任何优化,但在多线程场景中不考虑这些效果,仅从单个线程考虑。 volatile 关键字告诉编译器这个变量可能被修改或从外部不可知的来源读取,编译器无法摆脱它或省略对它的内存访问。

    【讨论】:

    • 这对于 volatile 来说一般是正确的,但这不适用于这种特殊情况。对于函数的调用者,函数内部是否将参数处理为 volatile 没有区别。
    【解决方案4】:

    简而言之,易失性的意思是“这个变量可能在这个程序之外被修改”。

    简而言之,这意味着变量的值可以在代码中没有任何相关指令的情况下发生变化。它通常用于低级 I/O,例如,寄存器或缓冲区的值可以由硬件设置。

    【讨论】:

    • 在这种情况下似乎不适用。编译器没有编译 InterlockedIncrement 函数,并且将变量标记为 volatile 在函数之外没有任何影响。
    • 很抱歉,我在阅读您的问题时一定跳过了一点。
    • 这与告诉编译器不要优化对变量的访问有关,即使在函数内部也是如此。我不确定为什么在原型中需要它,只是告诉你如何处理你的参数。
    • @Suma “编译器没有编译函数”是什么意思?肯定有一些编译器确实编译过它在某个时候
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 2011-06-23
    • 2013-03-07
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    相关资源
    最近更新 更多