volatile的本意是“易变的”,由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如:

  

static int i=0; int main(void) { ... while (1) { if (i) dosomething(); } } /* Interrupt service routine. */ void ISR_2(void) { i=1; }   

程序的本意是希望ISR_2中断产生时,在main当中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致dosomething永远也不会被调用。如果将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行)。此例中i也应该如此说明。

一般说来,volatile用在如下的几个地方:

  1、中断服务程序中修改的供其它程序检测的变量需要加volatile;

  2、多任务环境下各任务间共享的标志应该加volatile;

  3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;

  另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。

注意:在vc6中,一般调试模式没有进行代码优化,所以这个关键字的作用看不出来。下面通过插入汇编代码,测试有无volatile关键字,对程序最终代码的影响:

  首先,用classwizard建一个win32 console工程,插入一个voltest.cpp文件,输入下面的代码:

#include <stdio.h> void main() { int i=10; int a = i; printf("i= %d",a); /*下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道*/ __asm { mov dword ptr [ebp-4], 20h } int b = i; printf("i= %d",b); }   

在调试版本模式运行程序,输出结果如下:

  i = 10

  i = 32

在release版本模式运行程序,输出结果如下:

  i = 10

  i = 10

  

输出的结果明显表明,release模式下,编译器对代码进行了优化,第二次没有输出正确的i值。下面,我们把 i的声明加上volatile关键字,看看有什么变化:

#include <stdio.h> void main() { volatile int i=10; int a = i; printf("i= %d",a); /*改变内存中i的值,但又不让编译器知道*/ __asm { mov dword ptr [ebp-4], 20h  } int b = i; printf("i= %d",b); }   

分别在调试版本和release版本运行程序,输出都是:

  i = 10

  i = 32

这说明volatile这个关键字发挥了它的作用!

细谈volatile限定符——上海先锋商泰面试归来相关推荐

  1. 计算n!中结尾零的个数——上海先锋商泰面试

    没看懂,找同学讨论了下后就懂了,主要是阶乘里是5的倍数的有几个?是5^2=25倍数的有几个?是5^3=225倍数的有几个?以此类推. 把这个理解了就好懂了. http://blog.csdn.net/ ...

  2. 先锋商泰面试实习经历

    朋友本科毕业就去了商泰做C++,所以听说这次是第一次不用校招就可以实习的机会,直接让我填了网申 我上一份(实习结束+过年)没多久+年初才决定毕业往C++方向发展,导致本科知识落下很多也没很多时间复习 ...

  3. C++ 学习笔记(19)new/delete表达式、定位new、typeid、dynamic_cast、type_info、枚举类型、成员函数指针、union、位域、volatile限定符、链接指示

    C++ 学习笔记(19)new/delete表达式.定位new.typeid.dynamic_cast.type_info.枚举类型.成员函数指针.union.位域.volatile限定符.链接指示 ...

  4. volatile限定符

    备注:volatile的确切含义与机器有关,只能通过阅读编译器文档来理解.要想让使用了volatile的程序在移植到新机器或新编译器后仍然有效,通常需要对该程序进行某些改变. 直接处理硬件的程序常常包 ...

  5. 固有的不可移植的特征之volatile限定符

    volatile的确切含义与机器相关,只能通过阅读编译器文档来理解,使用volatile的程序在移到新的机器或编译器时通常必须改变. 直接处理硬件的程序常具有这样的数据成员,它们的值由程序本身直接控制 ...

  6. volatile限定符{C}

    PS: ...Newbie love coding-  Linux_c一站式编程(volatile限定符介绍) linux_c的volatile限定符 现在探讨一下编译器优化会对生成的指令产生什么影响 ...

  7. C语言 const、volatile、const volatile限定符理解

      在C语言经常会用到变量类型限定符const和volatile,但是const和 volatile也可以一起使用.下面就一次分析一下这三种情况的使用方法. 1.const   从字面意思理解,意思就 ...

  8. volatile限定符——C++讲解

    1.使用volatile的背景 直接处理硬件的程序常常包含这样的数据元素,它们的值由程序直接控制之外的过程控制.举例如下 : i.程序可能包含一个由系统时钟定时更新的变量.当对象的值可能在程序的控制或 ...

  9. C语言volatile类型限定符详解

    一.volatile类型限定符 volatile是一个类型修饰符(type specifier),就像我们熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量:volatile的作用是作 ...

最新文章

  1. window opengl
  2. 重磅 | GitHub 2019 数字年报全文正式发布
  3. python识别人脸多种属性_人脸检测及识别python实现系列(4)——卷积神经网络(CNN)入门...
  4. Redis中的set应用场景
  5. AUTOSAR专业知识篇(八)-ID.3 和大众的电气化平台
  6. nodejs-- vuex中mapActions
  7. 利用innerHTML实现隐显效果-两种实现方法
  8. Navicat无法连接SqlServer数据库
  9. Android开发周报:Android 8.0开始推送、微店插件化实践
  10. 实现本地svn目录同步时,服务器的相应目录保持自动同步
  11. 你需要的不是实时数仓 | 你需要的是一款强大的OLAP数据库(下)
  12. bzz xch出来后fil未来会怎么样?
  13. Xcel 测试版使用手册
  14. PTC过流保护器件工作原理及选型方法
  15. windows输入法只有中文导致无法使用一系列快捷键问题
  16. JS密码校验规则前台验证(不能连续字符(如123、abc)连续3位或3位以上)(不能相同字符(如111、aaa)连续3位或3位以上)
  17. 用png格式图片和非png格式图片做水印图片
  18. 最受欢迎的健身软件推荐合集
  19. 用JavaScript去找出一个数组里的所有素数(质数)
  20. 基于51单片机实现红绿灯功能

热门文章

  1. 如何判断CRM软件的好坏?2023年CRM系统排行榜前三名是什么?
  2. linux中的inode文件编号和软硬链接
  3. 工程基建--前端基建
  4. echarts图表鼠标滑过页面抖动
  5. k8s --洗洗脑--云计算趋势
  6. [PS] 1999 寂静岭 Silent Hill
  7. 20135316王剑桥 linux第三周课实验笔记
  8. 达内培训c语言怎么样,达内培训 C语言和C++到底有什么关系?
  9. SCI一区:IEEE TSMC老师2021年2月修改稿反馈
  10. BBB(BeagleBone Black)硬件配置简介