C volatile的用法及意义
volatile影响编译器编译的结果,volatile指出 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错。
例如:
1 | volatile int i=10; |
volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。
而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。
一个参数既可以是const还可以是volatile吗?解释为什么。
是的。
一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
一个指针可以是volatile 吗?解释为什么。
是的。
尽管这并不很常见。一个例子是当一个中服务子程序修改一个指向一个buffer的指针时。
下面的函数有什么错误:
1 | int square(volatile int *ptr) |
这段代码有点变态。这段代码的目的是用来返指针ptr指向值的平方,但是,由于ptr指向一个volatile型参数,编译器将产生类似下面的代码:
1
2
3
4
5
6
7int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返回的不是你所期望的平方值!
正确的代码如下:
1 | long square(volatile int *ptr) |
Comments