volatile int some_int = 100; //note the 'volatile' qualifier now!
型 换句话说,我会解释如下: volatile告诉编译器, “嘿,编译器,我是不稳定的,你知道,我可以被一些你甚至没有意识到的XYZ改变。XYZ可以是任何东西。也许是这个星球外的某个外星人叫程序。也许一些 lightning ,某种形式的中断,火山等可以突变我。也许吧。你永远不知道谁会改变我!所以啊,你们这些无知的人,不要再扮演一个无所不知的上帝了,在我在场的地方,不要敢碰代码。好吗?” 这就是volatile阻止编译器优化代码的原因。现在搜索网络以查看一些示例。 引用C++标准($7.1.5.1/8) [..]volatile是对实现的一个提示,以避免涉及对象的积极优化,因为对象的值可能会被实现无法检测到的方式更改。 相关主题: Does making a struct volatile make all its members volatile?
2条答案
按热度按时间72qzrwbm1#
考虑这段代码,
字符串
当这个程序被编译时,编译器可能会优化这个代码,如果它发现这个程序never曾经试图改变
some_int
的值,因此,可能会尝试通过将while(some_int == 100)
更改为 something(等效于while(true)
)来优化while
循环,以便执行速度更快(因为while
循环中的条件似乎总是true
)。* (如果编译器没有优化它,那么它必须在每次迭代中获取some_int
的值并将其与100进行比较,这显然有点慢。然而,有时候,优化(程序的某些部分)可能是不受欢迎的,因为它可能是其他人从编译器不知道的程序外部更改
some_int
的值,因为它看不到它;但这是你设计的在这种情况下,编译器的优化将不产生预期的结果!因此,为了确保获得所需的结果,您需要以某种方式阻止编译器优化
while
循环。这就是volatile
关键字发挥作用的地方。你只需要这么做型
换句话说,我会解释如下:
volatile
告诉编译器,“嘿,编译器,我是不稳定的,你知道,我可以被一些你甚至没有意识到的XYZ改变。XYZ可以是任何东西。也许是这个星球外的某个外星人叫程序。也许一些 lightning ,某种形式的中断,火山等可以突变我。也许吧。你永远不知道谁会改变我!所以啊,你们这些无知的人,不要再扮演一个无所不知的上帝了,在我在场的地方,不要敢碰代码。好吗?”
这就是
volatile
阻止编译器优化代码的原因。现在搜索网络以查看一些示例。引用C++标准($7.1.5.1/8)
[..]volatile是对实现的一个提示,以避免涉及对象的积极优化,因为对象的值可能会被实现无法检测到的方式更改。
相关主题:
Does making a struct volatile make all its members volatile?
5gfr0r5j2#
在计算机编程中,特别是在C、C++和C#编程语言中,使用
volatile
关键字声明的变量或对象通常具有与优化和/或线程相关的特殊属性。一般来说,volatile
关键字是为了防止(伪)编译器对代码应用任何优化,假设变量的值不能“自己”改变。(c)Wikipediahttp://en.wikipedia.org/wiki/Volatile_variable