为什么我们使用volatile关键字? [重复]

问题描述 投票:317回答:2

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

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

c++ volatile compiler-optimization
2个回答
1031
投票

考虑一下这段代码

int some_int = 100;

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

当这个程序被编译时,编译器可能会优化这段代码,如果它发现程序从未尝试改变some_int的值,那么可能很想通过将whilewhile(some_int == 100)更改为某个东西来优化while(true)循环。相当于while,因此执行速度可能很快(因为true循环中的条件似乎总是为some_int)。 (如果编译器没有优化它,那么它必须获取some_int的值并将其与100进行比较,在每次迭代中显然有点慢。)

但是,有时,优化(程序的某些部分)可能是不合需要的,因为可能是其他人正在从编译器不知道的程序外部更改while的值,因为它无法看到它;但这就是你设计它的方式。在这种情况下,编译器的优化不会产生预期的结果!

因此,为了确保获得所需的结果,您需要以某种方式阻止编译器优化volatile循环。这就是volatile int some_int = 100; //note the 'volatile' qualifier now! 关键字发挥作用的地方。你需要做的就是这个,

volatile

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

volatile告诉编译器,

“嘿编译器,我很不稳定,你知道,我可以通过一些你甚至都不知道的XYZ来改变。那个XYZ可能是任何东西。也许这个星球外的一些外星人称为程序。也许有些照明,某种形式中断,火山等等可以让我变异。也许。你永远不知道谁会改变我!所以你无知,不要再扮演一个全知的神,也不敢触摸我在场的代码。好的?”

好吧,这就是Does making a struct volatile make all its members volatile?阻止编译器优化代码的方式。现在搜索网络以查看一些示例示例。


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

[...] volatile是对实现的暗示,以避免涉及对象的激进优化,因为对象的值可能会被实现无法检测到的更改。[...]

相关主题:

volatile


15
投票

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

qazxswpoi

© www.soinside.com 2019 - 2024. All rights reserved.