这几天,趁着下一个项目还没来的间隙,决定好好补一补C语言, 看见《 C Primer Plus 》书里的这段话,书是跟同事借的,因为知道我这“聪明的”脑袋基本记不住事儿,只好记录下来等忘了时再看;又因为很懒,所以干脆把记下来的东西,贴在博客上凑数,这样子博客上就又多了一篇读书笔记了,嘿嘿。 这里要成我的学习笔记本了,咯咯。
ANSI C新规定了三个限定词,volatile,restrict,const。
限定词volatile告诉编译器该变量除了可被程序改变以外还可以被其他代理改变。典型地,它被用于硬件地址和与其他并行运行的程序共享的数据。例如,一个地址中可能保存着当前的时钟时间。不管程序做些什么,该地址的值都会随着时间而改变。另一种情况是一个地址被用来接收来自其他计算机的信息。
volatile int locl; /*locl是一个易变的位置 */
volatile int *ploc; /*ploc指向一个易变的位置 */
您可能以为volatile是一个有趣的外行的概念,但您也可能奇怪为什么ANSI觉得有必要把volatile作为一个关键字。原因是它可以方便编译器优化。例如,假定有如下代码:
val1 = x;
/* 一些不使用x的代码x */
val2 = x;
一个聪明的(优化的)编译器可能注意到您两次使用了x, 而没有改变它的值。编译器将把x临时存储在一个寄存器中。接着,当val2需要x时,可以通过从寄存器而非初始的内存位置中读取该值以节省时间。这个过程被称为缓存(caching)。通常,缓存是一个好的优化方式,但如果在两个语句间其他代理改变了x的话就不是这样了。如果没有规定volatile关键字,编译器将无从得知这种改变是否可能发生。因此,为了安全起见,编译器不使用缓存。那是在ANSI以前的情形。然而现在,如果在声明中没有使用关键字volatile,编译器就可以假定一个值在使用过程中没有被修改,它就可以试着优化代码。
所以,我们可以得出这样的结论:如果使用了volatile,不适用缓存而是从初始的内存中读取该值; 如果没有使用volatile, 就利用缓存的方法从寄存器中读取。 (这段话不是书上的,是俺个人的读书心得,呵呵。)
一个值可以同时是vonst和volatile。例如,硬件时钟一般设定为不能由程序改变,这一点使他成为const; 但它被程序以外的代理改变,这使它成为volatile的。只需在声明中同时使用这两个限定词,如下所示,顺序并不重要:
volatile const int ioc;
const volatile int *ploc;
|
ANSI C之关键词volatile
最新推荐文章于 2024-11-14 18:25:53 发布