cmd10

导航

voaltile的作用说明

volatile的作用是告诉编译器不要对语句进行优化。

例如:

int a = 0;

a = 1;

a = 2;

a = 3;

a = 4;

这样的语句在编译时,编译器会对其进行优化,最后只生成a = 4语句对应的机器代码。

 

但是如果在这些语句前面加上volatile的话,那么编译器就不会对其进行优化,从而编译之后会生成四条语句对应的机器代码。

 

其实volatile真正的作用是告诉编译器,每次在使用volatile声明的变量时,都要去内存读取这个变量的值。

例如:

int func(volatile int *ptr)

{  

  return (*ptr) * (*ptr);

}

这样的函数返回一个数的平方值是有问题的,因为在运行过程中*ptr的之有可能被其他进程改变。其实在编译之后上述代码和下面的代码相同:

int func(volatile int *ptr)

{

  int a, b;

  a = *ptr;

  b = *ptr:

  return a * b;

}

由于这个里面有两次获取*ptr的值,但是每一次都是去内存中获取,所以在第一次获取完之后,*ptr的值就有可能被其他线程改变了,所以b和a的值可能就会不同。正确的写法应该是:

int func(volatile int *ptr)

{

  int a = *ptr;

  return a * a;

}

 

posted on 2015-04-13 00:09  cmd10  阅读(141)  评论(0)    收藏  举报