我从未使用过它,但我想知道为什么人们使用它?它究竟是做什么的?我搜索了论坛,我发现它只有 C# 或 Java 主题。
考虑这段代码,
int some_int = 100; while(some_int == 100) { //your code }
当这个程序被编译时,编译器可能会优化这个代码,如果它发现程序 从来 没有尝试改变 的值some_int,所以它可能会试图通过将循环从更改为等价的 东西 来优化while循环执行可能很快(因为循环中的条件似乎总是)。 (如果编译器不对其进行优化,那么它必须 在每次迭代中获取 100 的值并将其与 100 进行比较,这显然有点慢。)while(some_int == 100) __while(true)``while``true some_int
some_int
while
while(some_int == 100)
while(true)``while``true
但是,有时,(程序的某些部分的)优化可能是 不可取 的,因为可能是其他人正在some_int从 程序外部更改编译器不知道的值 ,因为它看不到它;但这就是你设计它的方式。在这种情况下,编译器的优化 不会 产生预期的结果!
因此,为了确保获得所需的结果,您需要以某种方式阻止编译器优化while循环。这就是volatile关键字发挥作用的地方。你需要做的就是这个,
volatile
volatile int some_int = 100; //note the 'volatile' qualifier now!
换句话说,我将解释如下:
volatile告诉编译器,
“嘿,编译器,我是易变的,你知道,我可以被一些你甚至不知道的 XYZ 改变。那个 XYZ 可以是任何东西。也许是这个星球之外的某个外星人,叫做程序。也许是一些闪电,某种形式中断,火山等可以使我变异。也许。你永远不知道谁会改变我!所以,你这个无知的人,不要再扮演一个无所不知的上帝了,不要在我所在的地方触碰代码。好吧?”
好吧,这就是volatile阻止编译器优化代码的方式。现在搜索网络以查看一些示例。
引用 C++ 标准 ($7.1.5.1/8)
[..] volatile 是对实现的提示,以 避免涉及对象的激进优化, 因为对象的值可能会通过实现无法检测到的方式进行更改。[…]