volatile字面意思:易变的。在计算机里,是防止优化的意思,然而是怎么防止优化的呢?待我一一道来哦。

先看这样一个例子:

<span style="font-size:18px;">#include<iostream>
using namespace std;
int main()
{int num = 10;int *p = &num;*p = 20;cout<<num<<endl;getchar();return 0;
}</span>

结果是什么呢?


由于p取得是num的地址,即p指向num,然后*p即取出p指向的内容,将它修改为20,所以结果输出num也被修改为20.

我们再看一个例子:

<span style="font-size:18px;">#include<iostream>
using namespace std;
int main()
{const int num = 10;int *p = (int*)#*p = 20;cout<<num<<endl;getchar();return 0;
}</span>

这里只是在int前加了const,将num设定为常量(在c语言中加const修饰变量叫常变量,c++中const修饰变量叫常量),所以无法修改num的值,结果如下:


这里我详细说明一下它是怎么执行的?调出内存看一下吧:

这是num所在的位置。赋值为10.

此时p就指向num。

内存里边p指向的内容确实改变了。但是我们看一下输出的结果:(如果在linux下演示的话,将代码编到test.c下,用命令gcc test.c -02 使优化级别最高进行测试)

为什么输出的结果却是10呢?p所指向的内容确实是num,但是在这里*p改变了,num却不受影响。。这个原因就在于const关键字。const将num这个变量修饰为常量,所以无法修改它,为了使常量不受破坏,就把它放在了寄存器中。以方便使用。又因为寄存器是不编址的,所以取地址根本不受影响。说起寄存器,看一下下面这幅图:(画的不错,网上抠下来的哈)

显而易见,最上边的是寄存器,是速度最快的,最下边是内存,是速度最慢的。那么问题来了,既然寄存器这么快,为什么不把变量都放在寄存器里呢。首先,学过计算机组成原理的同学都知道,寄存器造价高,空间小,可经不起那样的伤害。所以我们尽可能的把它们放在内存中,内存的空间大小可比寄存器的大多了。

为了解决上面的问题,我们引来了另一个关键字:volatile。

volatile是这样使用的。

#include<iostream>
using namespace std;
int main()
{volatile const int num = 10;int *p = (int*)#*p = 20;cout<<num<<endl;getchar();return 0;
}

这样,volatile会防止编译器的优化,保证内存的可见性。也就是不将num放入寄存器,而是放在内存中,这样就可以找到它的地址,进而修改它了。

结果是:

以上就是volatile的简单介绍,希望能对大家的认识有所帮助哦,欢迎来访~~

详解volatile关键字相关推荐

  1. Java基础:详解static关键字与类加载顺序

    1. 前言 前文中说到了static关键字,在Java中这是一个很重要的关键字,它有很多的用法,并且在某些特定的情况下使用可以优化程序的性能.本文学习static关键字的应用场景.在这之前了解变量的类 ...

  2. 一篇带你详解static关键字(超详细)

    文章目录 前言 一.static可以修饰哪些东西? 二.static修饰属性 1.为什么要引入static? 2.final和static的区别 3.修饰属性总结 二.static修饰方法 2.1为什 ...

  3. scala 隐式详解(implicit关键字)

    掌握implicit的用法是阅读spark源码的基础,也是学习scala其它的开源框架的关键,implicit 可分为: 隐式参数 隐式转换类型 隐式调用函数 1.隐式参数 当我们在定义方法时,可以把 ...

  4. 详解c++关键字。namespace命名空间的用法。实际开发中namespace应用场景。

    namespace 命名空间 要介绍namespace就先要讲明白c语言域的概念 域 什么是域呢?域就是变量作用的空间,在c++中,域被分为全局作用域和局部作用域. 一个域中的变量不能重名.不同域之间 ...

  5. java内存 海子_Java虚拟机:JVM内存模型和volatile详解

    JVM内存模型和volatile详解 Java内存模型 随着计算机的CPU的飞速发展,CPU的运算能力已经远远超出了从主内存(运行内存)中读取的数据的能力,为了解决这个问题,CPU厂商设计出了CPU内 ...

  6. Java并发编程:JMM和volatile关键字

    Java内存模型 随着计算机的CPU的飞速发展,CPU的运算能力已经远远超出了从主内存(运行内存)中读取的数据的能力,为了解决这个问题,CPU厂商设计出了CPU内置高速缓存区.高速缓存区的加入使得CP ...

  7. Java中final类是存放在哪_详解Java中的final关键字

    1 修饰属性或者变量 无论属性是基本类型还是引用类型,作用都是变量里面存放的"值"不可变 经常和static关键字一起使用,作为常量 1 基本类型,变量放的是实实在在的值,如1,& ...

  8. java语言之super关键字详解

    文章目录 前言 一.super介绍 二.super的语法 三.super内存图 四.super小结 前言 你第一次遇到super关键字是什么时候呢?是不是使用IDEA或者eclipse快捷键生成类构造 ...

  9. Java Volatile 详解

    Java Volatile 详解 Volatile:是java虚拟机提供的轻量级的同步机制.保证可见性.禁止指令重排序.不保证原子性!!! 学习Volatile之前必须了解JAVA内存模型. Java ...

最新文章

  1. IOS和Andriod手机浏览器内核
  2. android studio cmake opencv_Mac下安装及配置OpenCV环境(Xcode)
  3. NET比较常用的性能优化技巧
  4. 基于事件驱动架构构建微服务第15部分:SPA前端
  5. Java ResourceBundle keySet()方法及示例
  6. fiddler抓包工具配置详解
  7. SegmentFault 技术周刊 Vol.16 - 浅入浅出 JavaScript 函数式编程
  8. python读取数据库数据类型_Python中从SQL型数据库读写dataframe型数据
  9. 腾讯云区块链产品负责人邵兵:产业区块链刚刚起步,做好基础设施才有可能进入2.0阶段
  10. 医疗数据分析——过高费用的异常检测
  11. JQuery 四个常用的DOM操作获得内容 - text()、html()、value 以及 val() ;取属性值attr()----前三个有回调函数
  12. 神经网络与深度学习(邱锡鹏版本)学习笔记11.23
  13. http://www.cnblogs.com/zxp_9527/archive/2009/05/07/1452253.html
  14. Windows 命令 WMIC 使用详解
  15. 八.声明圆锥体类,实现Area和vloume接口计算表面积和体积,按体积大小进行比较...
  16. JPEG 图片存储格式与元数据解析
  17. 电脑qq语音连不到服务器,我的电脑不能语音聊天是怎么回事?每次qq上都提示:您的麦克风没有声音?我检查了电脑设置没问题...
  18. excel服务器 微信设置密码,如何用vba给excel工作簿批量设置添加打开密码? - EXCEL VBA - ExcelOffice【微信公众号:水星Excel】...
  19. 【C语言】数字直角三角形,数字矩阵,蛇形数组
  20. python高清壁纸_爬虫 抓取王者荣耀所有英雄皮肤高清壁纸(完美版本)

热门文章

  1. 一个切图仔的 CSS 笔记
  2. 查找标题已知的窗口句柄,遍历窗口控件句柄
  3. codeforces 732/D 二分
  4. java 通道 双向原理_Java-NIO(四):通道(Channel)的原理与获取
  5. php怎么改标题,PHP – 如何更改包含header.php的页面标题?
  6. php试卷A高质量含答案,php试卷A高质量含答案
  7. blue html中转换,Vue/Vue中Html和Markdown互相转换/README.md · bluemoon/LearningNotes - Gitee.com...
  8. androidstudio带pom的上传到jcenter_输送机@网带输送机@304网带输送机@304不锈钢网带输送机@输送机网带厂家定制...
  9. java单元测试算初级_Java____Eclipse下JUnit单元测试(初级)
  10. 实体 联系 模型mysql_数据库系统概念读书笔记――实体-联系模型_MySQL