zoukankan      html  css  js  c++  java
  • volatile限定符

    备注:volatile的确切含义与机器有关,只能通过阅读编译器文档来理解。要想让使用了volatile的程序在移植到新机器或新编译器后仍然有效,通常需要对该程序进行某些改变。

      直接处理硬件的程序常常包含这样的数据元素,它们的值由程序直接控制之外的过程控制。例如,程序可能包含一个由系统时钟定时更新的变量。当对象的值可能在程序的控制或检测之外被改变时,应该将对象声明为volatile。关键字volatile告诉编译器不应该对这样的对象进行优化。

      volatile限定符的用法和const很相似,它起到对类型额外修饰的作用:

    volatile int display_register;//该int值可能发生变化
    volatile Task *curr_task;//curr_task指向一个volatile对象
    volatile int iax[max_size];//iax的每个元素都是volatile
    volatile Screen bitmapBuf;//bitmapBuf的每个成员都是volatile
    

      const和volatile限定符互相没有什么影响,某种类型可能既是const的也是volatile的,此时它同时具有两者的属性。

      就像一个类可以定义const成员函数一样,它可以将成员函数定义成volatile的,只有volatile的成员函数才能被volatile的对象调用。

      const限定符和指针的相互作用,在volatile限定符和指针之间也存在类似的关系。我们可以声明volatile指针,指向volatile对象的指针以及指向volatile对象的volatile指针:

    volatile int v;//v是一个volatile int
    int *volatile vip;//vip是一个volatile指针,它指向int
    volatile int *ivp;//ivp是一个指针,它指向一个volatile int
    //vivp是一个volatile 指针,它指向一个volatile int
    volatile int *volatile vivp;
    
    int *ip=&v;//错误,必须使用 指向volatile的指针
    ivp=&v;//正确,ivp是一个指向volatile的指针
    vivp=&v;//正确,vivp是一个指向volatile的volatile指针
    

      和cosnt一样,我们只能将一个volatile对象的地址(或者拷贝一个指向volatile类型的指针)赋给一个指向volatile的指针。同时,只有当某个引用是volatile的时,我们才能使用一个volatile对象初始化该引用。

    合成的拷贝对volatile对象无效

      cosnt和volatile的一个重要区别是我们不能使用合成的拷贝/移动构造函数及赋值运算符初始化volatile对象或从volatile对象赋值。合成的成员接受的形参类型是(非volatile)常量引用,显然我们不能把一个非volatile引用绑定到一个volatile对象上。

      如果一个类希望拷贝、移动或者赋值它的volatile对象,则该类必须自定义拷贝或移动操作。例如,我们可以将形参类型指定为const volatile引用,这样我们就能利用任意类型的Foo进行拷贝或赋值操作了:

    class Foo
    {
    public:
    	Foo(const volatile Foo&);//从一个volatile对象进行拷贝
    	//将一个volatile对象赋值给一个非volatile对象
    	Foo& operator=(volatile const Foo&);
    	//将一个volatile对象赋值给一个volatile对象
    	Foo& operator=(volatile const Foo&)volatile;
    	//Foo类剩余的部分
    };
    

      尽管我们可以为volatile对象定义拷贝和赋值操作,但是一个更深层次的问题是拷贝volatile对象是否有意义?不同程序使用volatile的目的各不相同。

    摘抄自《C++ primer》(第五版)P757

  • 相关阅读:
    算法笔记_182:历届试题 核桃的数量(Java)
    算法笔记_181:历届试题 回文数字(Java)
    算法笔记_180:历届试题 国王的烦恼(Java)
    算法笔记_179:历届试题 数字游戏(Java)
    算法笔记_178:历届试题 邮局(Java)
    算法笔记_177:历届试题 城市建设(Java)
    算法笔记_176:历届试题 最大子阵(Java)
    算法笔记_175:历届试题 蚂蚁感冒(Java)
    redis集群与分片(2)-Redis Cluster集群的搭建与实践
    redis集群与分片(1)-redis服务器集群、客户端分片
  • 原文地址:https://www.cnblogs.com/wuyepeng/p/9784922.html
Copyright © 2011-2022 走看看