C volatile的用法及意义
Angie An

volatile影响编译器编译的结果,volatile指出 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错。

例如:

1
2
3
4
volatile int i=10; 
int j = i;
...
int k = i;

volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。

而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。

  1. 一个参数既可以是const还可以是volatile吗?解释为什么。

    是的。

    一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

  2. 一个指针可以是volatile 吗?解释为什么。

    是的。

    尽管这并不很常见。一个例子是当一个中服务子程序修改一个指向一个buffer的指针时。

  3. 下面的函数有什么错误:

1
2
3
4
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
  • 这段代码有点变态。这段代码的目的是用来返指针ptr指向值的平方,但是,由于ptr指向一个volatile型参数,编译器将产生类似下面的代码:

    1
    2
    3
    4
    5
    6
    7
    int square(volatile int *ptr)
    {
    int a,b;
    a = *ptr;
    b = *ptr;
    return a * b;
    }
  • 由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返回的不是你所期望的平方值!

    正确的代码如下:

1
2
3
4
5
6
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
 Comments