volitale小结

2010年5月13日 由 yybean 留言 »

很人可能对volatile不熟吧,它是说明一个变量和对象不仅可以由程序代码改变夜可以由硬件或操作系统,其他正在运行的线程所改变的。

所谓的不可见,是指编译器不可预见.  
  具体实现包括中断例程,多线程都可以改变变量的值.  
  举个例子:  
  volatile   int   v;  
  void   func()  
  {   int   a,b;  
      a=5*v;  
      b=5*v;  
      ….  
  }  
  如果v是个普通的变量,编译器很可能会做这样的优化,  
  第一次计算出5*v的值后,先赋给a,然后直接又从寄存赋给b,  
  而不会重新计算5*v.  
  如果定义成volatile,编译器则不会做任何优化,每次都会  
  重新读取v的值.

在执行a=5*v之后,有可能恰好在此时出现中断,  
  将v的值改变,这时再执行b=5*v,结果应该是a和b的值不相同,  
  但如果编译器按上面的规则一优化,则a和b永远会相同,为了  
  避免出现这种情况,于是将v定义成volatile的.

一个变量可以同时被说明为const和volatile吗?
可以。const修饰符的含义是变量的值不能被使用了const修饰符的那段代码修改,但这并不意味着它不能被这段代码以外的其它手段修改。例如,在2. 6的例子中,通过一个volatile const指针t来存取timer结构。函数time_addition()本身并不修改t->value的值,因此t->value被说明为const。不过,计算机的硬件会修改这个值,因此t->value又被说明为volatile。如果同时用const和volatile来说明一个变量,那么这两个修饰符随便哪个在先都行

 

const volatile unsinged int *recher=(const unsiged int*)1234;

应为有了const 的修饰,一般代码不可以改变指针指向的内容;又应为有volatile 的修饰,可以通过硬件(汇编语言)来改变。

 

http://hondrif82q.spaces.live.com/blog/cns!776E82726DE60562!175.entry

广告位

留下评论