zoukankan      html  css  js  c++  java
  • volatile和const

    volatile可理解为“编译器警告指示字”

    volatile用于告诉编译器必须每次去内存中取变量值

    volatile主要修饰可能被多个线程访问的变量

    volatile也可以修饰可能被未知因数更改的变量

    const和volatile放在一起的意义在于:

    (1)本程序段中不能对a作修改,任何修改都是非法的,或者至少是粗心,编译器应该报错,防止这种粗心;
    (2)另一个程序段则完全有可能修改,因此编译器最好不要做太激进的优化。

    “const”含义是“请做为常量使用”,而并非“放心吧,那肯定是个常量”。
    “volatile”的含义是“请不要做没谱的优化,这个值可能变掉的”,而并非“你可以修改这个值”。
    因此,它们本来就不是矛盾的。

    const修饰的变量不允许这里修改不代表不允许别处修改,比如:
    int i = 5;
    const int* p = &i;
    i = 6; // 不可以;
    *p = 7; // 完全可以,而且那个“const”的“*p”也跟着变成了7。

    对于非指针非引用的变量,const volatile同时修饰的意义确实不大。个人觉得。

    需要明白“volatile”的含义并非是“non-const”。所以他们才可以放在一起。
    在C++语言中,const没有反义词,如果一个变量没有const修饰,那它本身就是const的反义词,而并非加上volatile才是const的反义词。

    两者同时修饰一个对象的典型情况,是用于驱动中访问外部设备的只读寄存器。

    http://topic.csdn.net/u/20071210/14/321d6ec5-f967-4afb-8d04-b335e6db7b34.html

    http://hi.baidu.com/honky/item/b42b278abbb820864414cf83

    留一个问题:const volatile int i=10;这行代码有没有问题?如果没有,那 i 到底是什么 属性?

    回答一:没有问题,例如只读的状态寄存器。它是volatile,因为它可能被意想不到地改变;它是const,因为程序不应该试图去修改它。volatile和const并不矛盾,只是控制的范围不一样,一个在程序本身之外,另一个是程序本身。

    回答二:没问题,const和volatile这两个类型限定符不矛盾。const表示(运行时)常量语义:被const修饰的对象在所在的作用域无法进行修改操作,编译器对于试图直接修改const对象的表达式会产生编译错误。volatile表示“易变的”,即在运行期对象可能在当前程序上下文的控制流以外被修改(例如多线程中被其它线程修改;对象所在的存储器可能被多个硬件设备随机修改等情况):被volatile修饰的对象,编译器不会对这个对象的操作进行优化。一个对象可以同时被const和volatile修饰,表明这个对象体现常量语义,但同时可能被当前对象所在程序上下文意外的情况修改。另外,LS错误,const可以修饰左值,修饰的对象本身也可以作为左值(例如数组)。

  • 相关阅读:
    Idea创建Hibernate bean类和.xml文件
    Hibernate 一对多,多对多,多对一检索策略
    Hibernate 性能优化一对一关联映射
    HashSet 与TreeSet和LinkedHashSet的区别
    使用LinkedList模拟一个堆栈或者队列数据结构
    设计模式------工厂模式和抽象工厂模式
    悟透JavaScript
    JS产生随机数的几个用法!
    防盗链
    nigin配置安全:三个案例看Nginx配置安全(转)
  • 原文地址:https://www.cnblogs.com/aspirant/p/3756524.html
Copyright © 2011-2022 走看看