为什么我们使用volatile关键字?

时间:2010-12-14 09:14:43

标签: c++ volatile compiler-optimization

  

可能重复:
  C++: When Has The volatile Keyword Ever Helped You?

我从未使用它,但我想知道为什么人们会使用它?它到底是做什么的?我搜索了论坛,发现它只是C#或Java主题。

2 个答案:

答案 0 :(得分:1010)

考虑这段代码,

int some_int = 100;

while(some_int == 100)
{
   //your code
}

当编译该程序时,编译器可能会优化此代码,如果它发现程序从不曾试图更改some_int的值,那么它可能会受到诱惑优化while循环,方法是将其从while(some_int == 100)更改为某事,等同于while(true),以便执行速度更快(因为while中的条件1}}循环似乎总是true(如果编译器没有优化它,那么它必须获取some_int的值并将其与100进行比较,在每次迭代中显然有点慢。)

但是,有时候,优化(程序的某些部分)可能不受欢迎,因为可能是其他人正在从之外的更改some_int的值程序哪个编译器不知道,因为它看不到它;但这就是你设计它的方式。在这种情况下,编译器的优化将产生所需的结果!

因此,为了确保获得所需的结果,您需要以某种方式阻止编译器优化while循环。这就是volatile关键字发挥作用的地方。你需要做的就是这个,

volatile int some_int = 100; //note the 'volatile' qualifier now!

换句话说,我会解释如下:

volatile告诉编译器,

  

“嘿编译器,我很不稳定,你   知道,我可以通过一些XYZ改变   你甚至都不知道。那   XYZ可以是任何东西。也许一些   外星人在这个星球外叫   程序。也许是一些照明,一些   形式的中断,火山等都可以   改变我。也许。你永远不知道谁   会改变我的!噢,你呢   无知,停止玩一个无所不知   上帝,不敢碰代码   我在哪里。还好吗?“

嗯,这就是volatile阻止编译器优化代码的方式。现在在网上搜索一些示例。


引用C ++标准($ 7.1.5.1 / 8)

  

[..] volatile是一个暗示   实施避免攻击性   涉及对象的优化   因为对象的价值可能   通过不可检测的方式改变   实现。[...]

相关主题:

Does making a struct volatile make all its members volatile?

答案 1 :(得分:14)

在计算机编程中,特别是在C,C ++和C#编程语言中,使用volatile关键字声明的变量或对象通常具有与优化和/或线程相关的特殊属性。一般来说,volatile关键字旨在防止(伪)编译器对代码应用任何优化,这些优化假设变量值不能“单独”更改。 (c)维基百科

http://en.wikipedia.org/wiki/Volatile_variable