为什么我们在C ++中使用volatile关键字?

可能重复:
C ++:何时有易变的关键字曾帮助你?

我从来没有使用过,但我想知道为什么人们使用它? 它究竟做了什么? 我search了论坛,我发现它只有C#或Java主题。

考虑这个代码,

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

当这个程序被编译时,编译器可以优化这个代码,如果它发现程序永远不会尝试改变some_int的值,所以可能会试图优化while循环,通过改变while(some_int == 100)简单while(true)以便执行可以是快速的(因为while循环中的条件似乎总是true )。 (如果编译器没有对其进行优化,那么它必须获取some_int的值(如果它没有加载到寄存器上),并将其与100进行比较,每次显然有点慢)。

然而,有时候,优化(你的程序的某些部分)可能是不受欢迎的 ,因为可能是别人正在从编译器不知道的程序之外改变some_int的值,因为它看不到它; 但这是你devise它的方式。 在这种情况下,编译器的优化不会产生预期的结果!

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

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

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

volatile告诉编译器,

“嘿,编译器,我是不稳定的,你知道,我可以通过一些XYZ来改变,你甚至不知道,XYZ可能是任何东西,也许是一些外星人在这个星球上称为程序。中断,火山等可能会使我发生变化,也许,你永远不知道谁会改变我!所以,你是无知的,不要玩一知半解的上帝,不敢碰我所在的代码。 ?”

那么这就是volatile如何防止编译器优化代码。 现在谷歌看到一些示例。


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

[…]挥发性是一个提示的实施,以避免积极的优化涉及的对象,因为对象的价值可能会改变手段无法检测实施。

相关主题:

是否使一个结构易失性使其所有成员变化?

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

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

volatile关键字是一个types限定符,用于声明某个对象可以通过某些操作系统,硬件或并发执行的线程在程序中进行修改。

不稳定的声明者;