volatile

来源:互联网 发布:nginx安装指定配置目录 编辑:程序博客网 时间:2024/06/04 19:56

volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象

下面的函数有什么错误:

[cpp] view plaincopy
  1. int square(volatile int *ptr)  
  2. {  
  3.     return *ptr * *ptr;  
  4. }  
 编译器将产生类似下面的代码:
[cpp] view plaincopy
  1. int square(volatile int *ptr)  
  2. {  
  3.     int a,b;  
  4.     a = *ptr;  
  5.     b = *ptr;  
  6.     return a * b;  
  7. }  

volatile是易变的,防止编译器优化,将直接从内存中取数字。所以

由于*ptr的值可能被意想不到的改变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:

[cpp] view plaincopy
  1. long square(volatile int *ptr)  
  2. {  
  3.     int a;  
  4.     a =*ptr;  
  5.     return a * a;  
  6. }  
0 0
原创粉丝点击