wendy_welcom的专栏

伊始ID:wendy_welcom
190次访问,排名2万外好友9人,关注者6
0
wendy_welcom的文章
原创 1 篇
翻译 0 篇
转载 1 篇
评论 0 篇
最近评论
文章分类
    收藏
      相册
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 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;
       

      发表于 @ 2008年02月20日 16:01:00|评论(loading...)|编辑

      旧一篇: 视图文件与二进制文件

      评论:没有评论。

      发表评论  


      当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
      Csdn Blog version 3.1a
      Copyright © wendy_welcom