3 回答

TA贡献1860条经验 获得超8个赞
考虑一下这段代码,
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从编译器不知道的程序外部更改它的值,因为它看不到它。但这就是您设计的方式。在这种情况下,编译器的优化将无法产生预期的结果!
因此,为了确保获得理想的结果,您需要以某种方式停止编译器优化while循环。这就是volatile关键字发挥作用的地方。您需要做的就是这个,
volatile int some_int = 100; //note the 'volatile' qualifier now!
换句话说,我将对此解释如下:
volatile 告诉编译器,
“嘿,编译器,我易变,而且,您甚至可以通过一些您甚至不知道的XYZ来更改我。XYZ可以是任何东西。也许是这个星球之外的某个外星人,称为程序。也许是一些照明,某种形式中断,火山等都可能使我突变。也许你永远都不知道谁会改变我!所以,你一无所知,不要再扮演一个全知的神,也不敢触摸我现在所在的代码。 ?
好吧,这就是volatile防止编译器优化代码的方式。现在在网上搜索以查看一些示例示例。
从C ++标准报价($ 7.1.5.1 / 8)
[..] volatile是实现避免使用对象的积极优化的暗示, 因为对象的值可能会通过实现无法检测到的方式进行更改。[...]
- 3 回答
- 0 关注
- 447 浏览
添加回答
举报