2012年(46)
分类: C/C++
2012-05-08 00:40:33
类型限定词volatile
参考资料:《C Primer Plus》P347
限定词volatile
告诉编译器该变量除了可被程序改变以外还可被其他代理改变。
典型地,它被用于硬件地址和其他并行运行的程序共享的数据。
例如,一个地址中可能保存着当前的时钟时间,不管程序做些什么,该地址的值都会随着时间而改变。另一种情况一个地址被用来接收来自其他计算机的信息。
语法:
volatile int locl; /*locl是一个易变的位置*/
volatile int *proc; /*ploc指向一个易变的位置*/
这些语句声明了locl是一个volatile值,并且ploc是一个指向volatile值。
作用:可以方便编译器优化,如:
val1 = x;
/*一些不使用x的代码*/
val2 = x;
一个聪明的(优化的)编译器可能注意到你两次使用了x,而没有改变它的值。它将把x临时存储在一个寄存器中。接着,当val2需要x时,可以通过从寄存器而非初始的内存位置中读取该值以节省时间。这个过程被称为缓存(caching)。通常,缓存是一个好的优化方式,但如果在两个语句间其他代理改变了x的话就不是这样了。如果没有规定volatile关键字,编译器将无从得知这种改变是否可能发生。因此,为了安全起见,编译器不使用缓存。那是在ANSI以前的情形。然而现在,如果在生命中没有使用关键字volatile,编译器就可以假定一个值在使用过程中没有被修改,它就试着优化代码。
一个值可以同时是const和volatile。
例如,硬件时钟一般设定为不能由程序改变,这一点使它称为const;但它被程序以外的代理改变,这使它称为volatile。
其声明如下:
volatile const int loc;
const volatile int *proc;
const、volatile的顺序不重要~~