zoukankan      html  css  js  c++  java
  • volatile学习

      volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。


        volatile的本意是“易变的”,不过翻译成“直接存取原始内存地址”更为合适。“易变”是因为外在因素引起的,象多线程,中断等,并不是因为用volatile修饰了的变量就是“易变”了,假如没有外因,即使用volatile定义,它也不会变化。

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

    >>
    #i nclude <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关键字,看看有什么变化:
    #i nclude <stdio.h>
    void main()
    {
    volatile int i=10;
    int a = i;
    printf("i= %d",a);
    __asm {
    mov dword ptr [ebp-4],20h
    }
    int b = i;
    printf("i= %d",b);
    }
    分别在调试版本和release版本运行程序,输出都是:
    i = 10
    i = 32
    这说明这个关键字发挥了它的作用!
  • 相关阅读:
    面向过程思想理解:
    Ajax的get请求向服务器请求数据五步骤?
    什么是Ajax无刷新技术?
    Ajax和JavaScript的区别
    为什么要用ajax
    好文章分享
    easyui系列之表单二Combogrid,Form,filebox,CheckBox(3)
    属性vs字段的关系
    jQuery-Load方法
    .Net 百度经纬度转高德
  • 原文地址:https://www.cnblogs.com/zcc1414/p/3982449.html
Copyright © 2011-2022 走看看