现在的位置: 首页 > 综合 > 正文

C++中的volatile做什么用的?(看书没看懂)

2012年12月23日 ⁄ 综合 ⁄ 共 1007字 ⁄ 字号 评论关闭
  • 问题内容:C++中的volatile做什么用的?(看书没看懂)
  • 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=4340502
  • 所属论坛:新手乐园     审核组:C/C++
  • 提问者:iwodgirl     解决者:goodluckyxl
  • 感谢:codearts、snowbirdfly、goodluckyxl
  • 关键字:
  • 答案:

    #include<iostream.h>
    #include<stdio.h>
    class VolatileFun{
        public :
            int val;
            volatile int f8();
    };

    volatile int VolatileFun::f8(){return val;}

    void main()
    {
        VolatileFun s;
        s.val=89;
        volatile int i=s.f8();
        i=23;                   //我自己加上去的,也可运行,且改变了i的值
        cout<<i<<endl;
        getchar();
    }

    新手问题,请知道的人指点!谢谢
    ---------------------------------------------------------------
    1、volatile 是保证访问的变量不被编译器优化
    比如申请的变量 a = 1; 如果嵌入汇编饶开编译器
    将a地址内容1改变掉
    而你不加volatile就还是原来的1 
    如果加了则会保证每次数据均是从a的地址处读出 
    4、寄存器操作一定要加!  一般的驱动程序里的端口操作也需要加, volatile只是保证你每次取变量地址都是从此变量的源地址取值!  比如声明 一个变量uint16 PortAddress=0x0001;  下面的代码中再也没有对 PortAddress进行赋值,如果没加 volatile,则你每次用PortAddress变量时系统会直接取1, 而不是去PortAddress的地址去取他的值,如果 PortAddress是硬件相关的,则可能会因为硬件的原因把他的值改变了(不再是0x0001),从而造成运行出错!

    MY VIEW: 
         简单的一句话 取消编译器对此修饰变量的任何优化
         所有对此数据操作都去相应地址中读写 而不会取自因优化而暂存的寄存器中

抱歉!评论已关闭.