时间:2014.05.24
地点:基地
--------------------------------------------------------------------------
一、简述
volatile限定符平时很少用到,今天倒是碰到了,所幸探个明白。volatile 英文字面意思是“不稳定的”,确切的计算机含义时与机器相关,所以在对包含volatile的程序在移植到新机器或使用不同的编译器时往往还需要对编译器进行一些改变。
--------------------------------------------------------------------------
二、为什么要有volatile这么个怪物
某些应用程序需要直接操作硬件相关的数据,这些数据的值由程序直接控制之外的过程控制。即该数据的值是不受程序直接控制的,但程序又要用到它,比如由硬件系统时钟更新的定时器变量。当对象的值可能在程序的控制或检测之外被改变时我们应该将对象声明为volatile。告诉编译器该对象不该进行优化处理。
volatile和const一样,只是一个对类型的修饰符。我们可以这样用:
volatltle int display_register; //该int值是可变的 volatitle Task *curr_task; //curr_task指向一个volatile对象 volatitle int iax[max_size]; //数组iax中的每个元素都是volatitle volatitle Screen bitmapBuf; //bitmapBuf的每个成员都是volatile
另外volatile 和 const虽然用法类似,但相互之间互不影响,可结合使用,再看几个volatile的类似用法
volatile int v; //v是一个volatile int int* volatile vip; //vip是一个volatile指针,指向intl类型对象 volatile int *ivp; //ivp是一个指针,指向一个volatile int 对象 volatile int* volatile vivp; //vivp是一个volatile指针,指向一个volatile int 对象
现在,我们进行如下赋值
int* ip=&v; //错误,ip是一个普通指针,不能指向volatile对象 ivp=&v; //ivp可指向volatile对象,正确 vivp=&; //vivp可指向volatile对象,正确,同时它也是一个volatile指针
--------------------------------------------------------------------------
三、合成的拷贝对volatile对象无效
const和volatile的重要区别是不能使用合成拷贝/移动构造函数及赋值运算符初始化volatile对象或从volatile对象赋值。我们知道,合成的成员接受的形参类型是常量引用(const T& ),是非volatile的,显然我们不能把一个非volatile引用绑定到一个volatile对象之上。
如果一个类希望拷贝、移动或赋值它的volatile对象,则该类必须自定义拷贝或移动操作。比如将形参类型指定为const volatile引用,如此才可正确实现对任意类型对象的拷贝或赋值。
class Foo { Foo(const volatile Foo&);//从一个volatile对象进行拷贝 Foo& operator=(volatile const Foo&);//将一个volatile对象赋值给一个非volatile对象 Foo& operator=(volatile const Foo&) volatile; //将一个volatile对象赋值给一个volatile对象 }
上面有一点:就是我们在类中可以就像定义const成员函数一样,我们也定义volatile成员函数,这时只有volatile成员函数才能被volatile对象调用。即就是const对象只能调用const成员函数一样,volatile对象只能调用volatile成员函数。
C++中的volatile(Primer读书笔记)