zoukankan      html  css  js  c++  java
  • 杂记 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

  • 相关阅读:
    supervisor 安装与使用
    CF39C-Moon Craters【dp】
    NWERC2020J-Joint Excavation【构造,贪心】
    CF25E-Test【AC自动机,bfs】
    CF19E-Fairy【树形结构,差分】
    CF11D-A Simple Task【状压dp】
    CF5E-Bindian Signalizing【单调栈】
    P6628-[省选联考 2020 B 卷] 丁香之路【欧拉回路,最小生成树】
    CF666E-Forensic Examination【广义SAM,线段树合并】
    CF235D-Graph Game【LCA,数学期望】
  • 原文地址:https://www.cnblogs.com/coder2012/p/3167665.html
Copyright © 2011-2022 走看看