C/C++ 中 volatile 关键字详解

为什么要有volatile


A volatile specifier is a hint to a compiler that an object may change its value in ways not specified by the language so that aggressive optimizations must be avoided.

大意是:volatile关键字所修饰的对象不能被编译器优化。

volatile关键字是一种类型修饰符,用它声明的类型变量表示可能被某些编译器未知的因素修改,比如:操作系统、硬件和其他线程等。遇到volatile关键字声明的变量,编译器对访问该变量的代码就不再进行优化,而是直接从内存读取。声明一个volatile变量的语法如下:

volatile int a = 0;

一个例子


//  C++/volatile/non_volatile.cpp
#include <stdio.h>int main()
{//不加上volatile,可能从寄存器读取int i = 10;int a = i;       //可能将i的值10放入寄存器,printf("i = %d\n", a);// 下面汇编语句的作用就是改变内存中i的值为32,但是又不让编译器知道// 如果看不懂汇编语言,可以先通过gcc -S -Wall生成汇编文件,再类比来写asm("movl   $32, -12(%rbp)");int b = i;      //这里可能会从寄存器读出i的值,为10printf("i = %d\n", b);    //输出可能为10return 0;
}
//  C++/volatile/volatile.cpp
#include <stdio.h>int main()
{//加上volatile之后,强制从内存读取volatile int i = 10;int a = i;printf("i = %d\n", a);// 下面汇编语句的作用就是改变内存中i的值为32,但是又不让编译器知道// 如果看不懂汇编语言,可以先通过gcc -S -Wall生成汇编文件,再类比来写asm("movl   $32, -12(%rbp)");int b = i;               //这里一定不会从寄存器读出i的值,而是从内存中读,因此b=32printf("i = %d\n", b);  //输出为32return 0;
}

volatile与指针


volatile与const类似:

volatile int v;          //volatile int变量
int i;                  //普通int变量//对于volatile int *vip可以这么理解,通过vip指针去访问时一定从内存读取,但是其他访问方式就不一定了
volatile int *vip;      //vip是一个指针,它既能指向volatile int,又能指向普通的intint *volatile ivp;     //ivp是一个volatile指针,它只能指向普通的int
volatile int *volatile vivp;vip = &v;              //正确
vip = &i;              //正确,vip既能指向volatile int,又能指向普通的int,这点跟const类似ivp = &v;               //错误,ivp只能指向普通的int
ivp = &i;              //正确vivp = &v;             //正确
vivp = &i;             //正确

多线程下的volatile


//定义一个volatile变量
volatile  BOOL  bStop  =  FALSE;

在一个线程中有:

//执行若干条语句
...
...bStop = false;

在另一个线程中有:

bStop  =  TRUE;
while(  bStop  );  //等待上面的线程终止.
//如果bStop不使用volatile申明,那么这个循环将是一个死循环,因为bStop已经读取到了寄存
//器中,寄存器中bStop的值永远不会变成FALSE,加上volatile,程序在执行时,每次均从内存
//中读出bStop的值,就不会死循环了。

[关键字]volatile相关推荐

  1. C++关键字Volatile的作用

    2019独角兽企业重金招聘Python工程师标准>>> 和const对应,const表示变量是恒定不变的,而Volatile则相反,表示变量随时都可能被改变,因此每次获取变量都需要重 ...

  2. C语言:关键字volatile详解!

    一.volatile 介绍 参看:volatile详解 参看:C Language Keywords Indicates that a variable can be changed by a bac ...

  3. C语言再学习 -- 关键字volatile

    上周确实事情挺多的,年会.公司聚餐,一到过年就有忙不完的事分心.还好C语言再学习总结的已经差不多了,年前也不展开别的了,接下来这十几天.总结几篇典型的面试题吧. 言归正传,接下来看看关键字 volat ...

  4. 每日一题(17)—— 关键字volatile的作用和三个不同的应用场合

    关键字volatile的作用和三个不同的应用场合 作用:防止编译器优化: (1)并行设备的硬件寄存器(如状态寄存器):// #define S5PV210_GPIO_DATA (*(volatile ...

  5. 关键字volatile的含意

    关键字volatile有什么含意并给出三个不同的例子. 答:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.精确地说就是,优化器在用到这个变量 ...

  6. C语言面试题小练——第10天:宏定义一年的秒数、变量定义练习、关键字volatile有什么含意

    文章目录 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) 2. 用变量a给出下面的定义 3. 关键字volatile有什么含意?并给出三个不同的例子. 1. 用 ...

  7. C语言基础 — 关键字volatile有什么含意? 三个不同的例子。

    关键字volatile有什么含意? 并给出三个不同的例子. 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.精确地说就是,优化器在用到这个变量 ...

  8. C语言中的关键字“ volatile”的用法(摘)

    C语言中的关键字" volatile"的用法(摘) volatile 这个ANSI C 关键字在经典的C 教程中很少提及,高层编程的人也可能永远都 不会用到,但是作为嵌入式开发者来 ...

  9. C++中关键字volatile和mutable用法

    C/C++中的volatile关键字和const对应,用来修饰变量,用于告诉编译器该变量值是不稳定的,可能被更改.使用volatile注意事项: (1). 编译器会对带有volatile关键字的变量禁 ...

  10. C++关键字volatile

    volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据.如果没有volatile关键字,则编译器可能优化读取和存储 ...

最新文章

  1. 数据科学和机器学习中使用的最多的20个R语言包
  2. python【数据结构与算法】选数问题(选不相连最大值——DP)
  3. 认清企业现状,做好信息化建设
  4. MVC3教程之新手入门(转)
  5. 2018牛客网暑期ACM多校训练营(第十场)J Rikka with Nickname(二分,字符串)
  6. 大数据技术Hbase 和 Hive 详解
  7. Apache Kylin原理学习之Cube的创建与Build
  8. mysql5.5索引如何定义_MySQL5.5索引数在InnoDB引擎内与索引数在mysql中定义的数量是不一致问题-阿里云开发者社区...
  9. 关于xp操作系统下使用VC6++编写的上位机软件在win10中运行的问题
  10. jmeter分布式性能测试
  11. jsp项目如何引入vue
  12. DSP 6678的NETCP
  13. MyBatis—引入外部配置文件(properties)
  14. 论文常用图表三:盒图 Boxplot【MATLAB】
  15. 用Java判断ab大小_比例类数据的差异性检验与AB测试的终止点
  16. vue 项目总结一组件开发的配置和例子
  17. 小猪佩奇的4种python玩法,带你趣味学python!
  18. 中国电信5G技术缩略语
  19. Python编写微信打飞机小游戏(三)
  20. c语言圆周率小数点后500万位,活久见!德科学家整理出圆周率小数点后500万位数字...

热门文章

  1. 求这样一个三位数,该三位数等于其每位数字的阶乘之和
  2. 神器Android键值数据库MMKV——基于 mmap 的高性能通用 key-value 组件
  3. vscode 开发 Java web 急速教程
  4. 达梦数据库dm7同构数据库的双向同步
  5. Linux中如何切换中文英文
  6. 将BMP图片转换成ICON图标
  7. 道翰天琼认知智能为您解密:Rust语言杀疯了!前有谷歌高薪争夺 Rust 人才,Facebook再官宣加入Rust基金会
  8. 推荐模型-基于知识图谱-2019:MKR
  9. java精尽面试题MySQL面试高频一百问(工程师方向)
  10. Win10电脑如何格式化