为什么我们在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)维基百科
volatile关键字是一个types限定符,用于声明某个对象可以通过某些操作系统,硬件或并发执行的线程在程序中进行修改。
不稳定的声明者;