首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我们在C ++中使用volatile关键字?[重复]

为什么我们在C ++中使用volatile关键字?[重复]
EN

Stack Overflow用户
提问于 2018-10-18 02:55:20
回答 2查看 0关注 0票数 0

可能重复: C ++:什么时候有挥发性关键字帮你?

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

EN

回答 2

Stack Overflow用户

发布于 2018-10-18 10:55:47

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

http://en.wikipedia.org/wiki/Volatile_variable

票数 0
EN

Stack Overflow用户

发布于 2018-10-18 12:07:46

考虑一下这段代码

代码语言:javascript
复制
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关键字扮演其角色的地方。你需要做的就是这个,

代码语言:javascript
复制
volatile int some_int = 100; //note the 'volatile' qualifier now!

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

volatile 告诉编译器,

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

好吧,这就是volatile阻止编译器优化代码的方法。现在谷歌看看一些示例。

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

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

相关主题:

使结构变为volatile会使其所有成员变得不稳定吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100002935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档