volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改。

用volatile关键字声明的变量i每一次被访问时,执行部件都会从i相应的内存单元中取出i的值。

没有用volatile关键字声明的变量i在被访问的时候可能直接从cpu的寄存器中取值(因为之前i被访问过,也就是说之前就从内存中取出i的值 保存到某个寄存器中),之所以直接从寄存器中取值,而不去内存中取值,是因为编译器优化代码的结果(访问cpu寄存器比访问ram快的多)。

以上两种情况的区别在于被编译成汇编代码之后,两者是不一样的。之所以这样做是因为变量i可能会经常变化,保证对特殊地址的稳定访问。

=====以下为转载======

volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改

,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的

代码就不再进行优化,从而可以提供对特殊地址的稳定访问。

使用该关键字的例子如下:
int volatile nVint;
  当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即

使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。

例如:
volatile int i=10;
int a = i;
...
//其他代码,并未明确告诉编译器,对i进行过操作

int b = i;
  volatile 指出 i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编

译器生成的汇编代码会重新从i的地址读取数据放在b中。而优化做法是,由于编译器发现两次从

i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在b中。而不是重新

从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说vola

tile可以保证对特殊地址的稳定访问。
  注意,在vc6中,一般调试模式没有进行代码优化,所以这个关键字的作用看不出来。下面

通过插入汇编代码,测试有无volatile关键字,对程序最终代码的影响:
  首先,用classwizard建一个win32 console工程,插入一个voltest.cpp文件,输入下面的

代码:
 
#i nclude <stdio.h>
void main()
{
 int i=10;
 int a = i;
 
 printf("i= %d/n",a);
 //下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道
 __asm {
  mov dword ptr [ebp-4], 20h
 }
 
 int b = i;
 printf("i= %d/n",b);
}     
然后,在调试版本模式运行程序,输出结果如下:
i = 10
i = 32
然后,在release版本模式运行程序,输出结果如下:
i = 10
i = 10
输出的结果明显表明,release模式下,编译器对代码进行了优化,第二次没有输出正确的i值。

下面,我们把 i的声明加上volatile关键字,看看有什么变化:
#i nclude <stdio.h>
void main()
{
 volatile int i=10;
 int a = i;
 
 printf("i= %d/n",a);
 __asm {
  mov dword ptr [ebp-4], 20h
 }
 
 int b = i;
 printf("i= %d/n",b);
}     
分别在调试版本和release版本运行程序,输出都是:
i = 10
i = 32
这说明这个关键字发挥了它的作用!

c语言中volatile关键字相关推荐

  1. c语言中volatile关键字的作用

    读文章之前 可以先看一下<程序员的自我修养 >第28页 过度优化. volatile 提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直 ...

  2. 【嵌入式】C语言中volatile关键字

    00. 目录 文章目录 00. 目录 01. volatile概述 02. volatile应用场景 03. volatile应用示例 04. 嵌入式系统中应用 05. volatile官方说明 vo ...

  3. c语言volatile含义,c语言中volatile关键字是什么含义怎么办呢?

    满意答案 yyvalentine 2016.11.26 采纳率:56%    等级:11 已帮助:4891人 C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立 ...

  4. C语言中volatile关键字与汇编__volatile__

    在gcc中,可以使用 __asm__ 进行汇编语言的内嵌. __volatile__ 表明编译器不要优化代码,后面的指令保持原样. C语言关键字volatile表明某个变量的值在外部可能被改变,因此对 ...

  5. c语言typeof 变量,c语言中typeof关键字

    为什么因为一个关键字而专门写一篇随笔呢?因为这个关键字在Linux里面地位非同一般!这个关键字typeof在linux内核里面使用非常广泛! 下面这两个等效声明,用于声明int类弄的变量a typeo ...

  6. C语言中extern关键字的使用

    C语言中extern关键字的使用,直接上代码. file1.c文件 #include<stdio.h> extern long power(int); int A = 2; int mai ...

  7. 【✊基础不牢,地动山摇のC语言中static关键字✊】

    C语言中static关键字 用static声明限定外部变量与函数,可以将其后声明的对象的作用域限定为被编译源文件的剩余部分.要降对象指定为静态存储,可以在正常的声明之前加上关键字static作为前缀. ...

  8. C语言中static关键字详解

    C语言中staic关键字很简单,简单到你的任何一个项目中可以不写一个staic关键字也是没有问题的.写这篇章主要是一下自己的staic的理解和应用,当然在章开头依旧要照本宣科简述一下static关键字 ...

  9. c语言中extern关键字_了解C语言中的extern关键字

    c语言中extern关键字 In this article, we'll take a look at understanding the extern keyword in C. 在本文中,我们将了 ...

最新文章

  1. linux进程间通信:无名管道 pipe
  2. 清华张钹院士、人大文继荣院长展开激情辩论:人类对AI的爱痴忧惧
  3. ArrayList 扩容
  4. Android AsyncTask源码解读
  5. 人工智能学习--文本检测和识别综述(2021)
  6. [深度学习] RCNNs系列(1) Ubuntu下Faster RCNN配置及训练和测试自己的数据方法
  7. Win32程序中使用Combo box控件
  8. Community Server系列之三:页面间关系2[介绍]
  9. 软硬件融合新时代——让软件够灵活,硬件够高效,鱼和熊掌可兼得
  10. python参考文献期刊格式_论文参考文献格式
  11. VsCode设置一行代码固定长度
  12. FPGA的NIOS-II开发入门
  13. 浏览器环境 兼容运行ES6语法
  14. 判断页面是否在微信或者企业微信环境下
  15. 【源码】elfun18:计算各种椭圆积分和函数
  16. PyQt学习随笔:QWidget的QFont的kerning、Antialiasing属性用途
  17. 通达信股票接口委托成功原理是什么?
  18. 艾奇KTV电子相册制作软件 4.7 破解安装版
  19. Uncaught TypeError: XXX is not a function问题解决
  20. 架构师知识体系(5)--建立自己的知识体系吧

热门文章

  1. 自学python需要下载什么软件-学python下载什么软件开发
  2. python打飞机源代码-如何用 Python 打飞机 ?
  3. python流程控制语句-【Python学习之三】流程控制语句
  4. 学python爬虫需要什么基础-从零开始教你学爬虫!python爬虫的基本流程!
  5. arcgis的python脚本-在ArcGIS中写python脚本读取shapefile
  6. python开发需要掌握哪些知识-Python基础学习需要掌握哪些知识
  7. python常用标准库有哪些-Python开发中常用的标准库
  8. python学精通要多久-零基础零经验自学Python,到精通Python要多久啊?
  9. java和python哪个好学-Java VS Python 应该先学哪个?
  10. 学python可以做什么知乎-学完Python后能做什么?