一个定义为volatile的变量是说,这个变量可能会被意想不到的改变,这样编译器就不会去假设这个变量的值。精确的说,优化器在用到这个变量时,必须每次都要小心的重新读取这个变量的值,而不是使用保存在寄存器里面的备份。
问题:
1- 一个参数既可以是const还可以是volatile吗?为什么?
解答:可以。例如:只读的状态寄存器,它是volatile的,因为这个寄存器状态可能会被意想不到的改变。它也是const的,因为程序不应该试图去修改它。
2- 一个指针可以是volatile吗?为什么?
解答:可以,但是这种情况不常见。例如:当一个中服务子程序修改一个指向buffer的指针时。
3- 下面的函数有什么错误?
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
解答:因为*ptr是指向一个volatile类型的参数,编译器将产生类似下面的代码:
int square(volatile int *ptr)
{
int a, b;
a = *ptr;
b = *ptr;
return a * b;
}
但是由于*ptr的值可能会被意想不到的改变,因此a和b的值可能是不同的。结果导致这段代码可能返回的值不是所期待的平方值。要想达到回复平方值的目的,代码可做如下修改:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}