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;
}
浙公网安备 33010602011771号