• 杂记 C中的volatile


    volatile

      就象大家更熟悉的const一样,volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。(摘自 百度百科)

      volatile 影响编译器编译的结果,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错。

      

    告诉compiler不能做任何优化

      

    表示用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能把他放在cache或寄存器中重复使用。

    笔试常见问题

    1)一个参数既可以是const还可以是volatile吗?解释为什么。 
    2); 一个指针可以是volatile 吗?解释为什么。 
    3); 下面的函数有什么错误: 
    int square(volatile int *ptr) 

    return *ptr * *ptr; 
    }

    1)是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变,所以在使用时候需要从内存中直接读取,而它是const是因为程序不应该试图去修改它。(完全是两个概念,一个是读取并不改变,改变是由于程序有可能对它造成改变,而const是为了不允许程序去改变它。) 
    2); 是的。尽管这并不很常见。一个例子是当一个中断服务子程序修该一个指向一个buffer的指针时。 
    3) 这段代码有点变态。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码: 
    int square(volatile int *ptr) 

      int a,b; 
      a = *ptr; 
      b = *ptr; 
      return a * b; 

    由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下: 
    long square(volatile int *ptr) 

      int a; 
      a = *ptr; 
      return a * a; 
    }

    参考

    http://www.cnblogs.com/chio/archive/2007/11/24/970632.html

  • 相关阅读:
    more命令
    mktemp命令
    有效的括号字符串
    mc命令
    字符串相加
    Vue中虚拟DOM的理解
    chattr命令
    记近一年线上项目经验及架构变更记录
    微博AnalysisQl动态数据视图元数据设计
    搭建prometheus+grafana监控SpringBoot应用入门
  • 原文地址:https://www.cnblogs.com/coder2012/p/3167665.html
Copyright © 2020-2023  润新知