zoukankan      html  css  js  c++  java
  • careercup-C和C++ 13.5

    13.5 谈谈C语言关键字”volatile”的意义(或重要性)?

    解答

    关键字volatile的作用是指示编译器,即使代码不对变量做任何改动,该变量的值仍可能被外界修改。操作系统、硬件或其他线程都可能修改该变量。该变量的值由可能遭受意料之外的修改,因此,每一次使用时,编译器都会重新从内存中获取这个值。

    volatile的意思是”易变的”,因为访问寄存器比访问内存要快得多, 所以编译器一般都会做减少存取内存的优化。volatile 这个关键字会提醒编译器,它声明的变量随时可能发生变化(在外部被修改), 因此,与该变量相关的代码不要进行编译优化,以免出错。

    声明一个volatile变量:

    volatile int x;
    int volatile x;

    声明一个指针,指向volatile型的内存(即指针指向的内存中的变量随时可能变化):

    volatile int *x;
    int volatile *x

    指向非volatile数据的volatile指针很少见,但也是可行的,声明一个volatile指针,指向非volatile内存::

    int* volatile x;

    声明一个volatile指针,指向volatile内存(即指针和指针所指物都随机可能变化):(volatile与const类似)

    volatile int * volatile x;
    int volatile * volatile x;

    volatile在声明上的使用和const是一样的。volatile在*号左边, 修饰的是指针所指物;在*号右边修饰的是指针。

    用volatile修饰的变量相关的代码不会被编译器优化,那么它有什么好处呢? 来看下面的例子:

    int opt = 1;
    void Fn(void){
        start:
            if (opt == 1) goto start;
            else break;
    }

    上述代码看起来就是一个无限循环的节奏,编译器可能会将它优化成下面的样子:

    void Fn(void){
        start:
            int opt = 1;
            if (true)
                goto start;
    }

    由于程序中并没有对opt进行修改,因此将if中的条件设置为恒真。这样一来, 就陷入了无限循环中。但是,如果我们给opt加上volatile修饰, 表明外部程序有可能对它进行修改。那么,编译器就不会做上述优化, 上述程序在opt被外部程序修改后将跳出循环。此外, 当我们在一个多线程程序中声明了一些全局变量,且任何一个线程都可以修改这些变量时, 关键字volatile也会派上用场。在这种情况下, 我们就要明确地告诉编译器不要对这些全局变量的相关代码做优化。

  • 相关阅读:
    java-多个数的和
    大道至简第二章
    大道至简第一章感悟上
    Tools
    LruCache
    Fragment
    科普指纹识别
    Python使用MySQL数据库
    Eclipse中添加PyDev插件
    UniversalAndroidImageLoader出现异常:ImageLoader: Unable to resolve host "https": No address associated with host
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4154383.html
Copyright © 2011-2022 走看看