zoukankan      html  css  js  c++  java
  • C++中的volatile做什么用的?(看书没看懂)

    • 问题内容: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: 
           简单的一句话 取消编译器对此修饰变量的任何优化
           所有对此数据操作都去相应地址中读写 而不会取自因优化而暂存的寄存器中

  • 相关阅读:
    HDU 5514 Frogs 欧拉函数
    HDU 5521 Meeting 最短路
    HDU 5527 Too Rich 贪心
    HDU 5525 Product 数论
    MFC中 编辑框内组合键的使用
    MyEclipse+Struts+Hibernate+Mysql开发环境配置
    SSH框架介绍
    mysql忘记密码的解决办法
    VS2010 MFC中 窗口分割的实现
    VS2010 MFC中 创建文件夹及文件判空的方法
  • 原文地址:https://www.cnblogs.com/bayonetxxx/p/1568598.html
Copyright © 2011-2022 走看看