为什么我们使用volatile关键字?

纳瓦兹

可能重复:
C ++:易失性关键字何时对您有所帮助?

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

纳瓦兹

考虑一下这段代码,

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是实现避免使用对象的优化的提示,因为对象的值可能会通过实现无法检测到的方式进行更改。[...]

相关主题:

使结构可变易变是否使所有成员可变易变?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当核心缓存同步是在硬件层面上完成的,为什么我们需要 volatile 关键字?

来自分类Dev

为什么我们在Angular组件中不使用关键字“ function”?

来自分类Java

为什么我们不能在静态方法中使用'this'关键字

来自分类Dev

为什么我们仍然在Groovy / Grails中使用package关键字?

来自分类Dev

为什么我们不能使用new关键字创建活动?

来自分类Dev

为什么我们要为表象班成员使用Kotlin中的“ override”关键字?

来自分类Java

为什么我们将final关键字与匿名内部类一起使用?

来自分类Dev

为什么我们需要在Angular中使用“ $ event”关键字进行事件绑定?(用于输出)

来自分类Dev

为什么我们不能在打字稿中的类中使用let关键字

来自分类Java

我们什么时候应该使用Java中抛出关键字?

来自分类Java

为什么jvm每次我们使用new关键字创建字符串时都会创建新字符串对象

来自分类Dev

为什么我们不能对接口中的方法一起使用默认访问修饰符和抽象关键字?

来自分类Dev

为什么我们使用带有new关键字(如布尔值)的原始数据类型来创建数组?

来自分类Dev

为什么我们称使用“new”关键字创建的内存为“动态内存”,因为它也是固定内存

来自分类Dev

为什么我们不能使用Java子类方法中的super关键字来调用超类构造函数?

来自分类Java

为什么我必须使用向前引用“this”关键字?

来自分类Dev

何时允许我们在Java中使用“ new”关键字以及如何使用它?

来自分类Java

我们能否避免不使用final关键字继承?

来自分类Dev

我们可以在UDF中使用关键字参数吗

来自分类Dev

我们可以使用Java关键字来命名类吗?

来自分类Dev

当我们使用 new 关键字时与创建对象的过程混淆

来自分类Dev

我们如何使用此关键字在div中选择输入元素

来自分类Dev

我们需要在控制器中使用 async/await 关键字吗?

来自分类Dev

当我们在TypeScript中使用clarify和export关键字时?

来自分类Dev

我们是否需要在.net 4.0或4.5中使用此关键字

来自分类Java

为什么局部变量不允许使用volatile关键字?

来自分类Java

为什么Java双重检查锁单例必须使用volatile关键字?

来自分类Dev

为什么在使用__syncthreads时我们不需要使用volatile变量

来自分类Dev

我们可以使用constant和returns关键字和a;改变solidity中变量的状态吗?

Related 相关文章

  1. 1

    当核心缓存同步是在硬件层面上完成的,为什么我们需要 volatile 关键字?

  2. 2

    为什么我们在Angular组件中不使用关键字“ function”?

  3. 3

    为什么我们不能在静态方法中使用'this'关键字

  4. 4

    为什么我们仍然在Groovy / Grails中使用package关键字?

  5. 5

    为什么我们不能使用new关键字创建活动?

  6. 6

    为什么我们要为表象班成员使用Kotlin中的“ override”关键字?

  7. 7

    为什么我们将final关键字与匿名内部类一起使用?

  8. 8

    为什么我们需要在Angular中使用“ $ event”关键字进行事件绑定?(用于输出)

  9. 9

    为什么我们不能在打字稿中的类中使用let关键字

  10. 10

    我们什么时候应该使用Java中抛出关键字?

  11. 11

    为什么jvm每次我们使用new关键字创建字符串时都会创建新字符串对象

  12. 12

    为什么我们不能对接口中的方法一起使用默认访问修饰符和抽象关键字?

  13. 13

    为什么我们使用带有new关键字(如布尔值)的原始数据类型来创建数组?

  14. 14

    为什么我们称使用“new”关键字创建的内存为“动态内存”,因为它也是固定内存

  15. 15

    为什么我们不能使用Java子类方法中的super关键字来调用超类构造函数?

  16. 16

    为什么我必须使用向前引用“this”关键字?

  17. 17

    何时允许我们在Java中使用“ new”关键字以及如何使用它?

  18. 18

    我们能否避免不使用final关键字继承?

  19. 19

    我们可以在UDF中使用关键字参数吗

  20. 20

    我们可以使用Java关键字来命名类吗?

  21. 21

    当我们使用 new 关键字时与创建对象的过程混淆

  22. 22

    我们如何使用此关键字在div中选择输入元素

  23. 23

    我们需要在控制器中使用 async/await 关键字吗?

  24. 24

    当我们在TypeScript中使用clarify和export关键字时?

  25. 25

    我们是否需要在.net 4.0或4.5中使用此关键字

  26. 26

    为什么局部变量不允许使用volatile关键字?

  27. 27

    为什么Java双重检查锁单例必须使用volatile关键字?

  28. 28

    为什么在使用__syncthreads时我们不需要使用volatile变量

  29. 29

    我们可以使用constant和returns关键字和a;改变solidity中变量的状态吗?

热门标签

归档