ANSI C之关键词volatile

这几天,趁着下一个项目还没来的间隙,决定好好补一补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;
 
  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

wendy_welcom

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值