8.5 volatile
volatile的语法与const是一样的,但是volatile的意思是“在编译器认识的范围外,这个数据可以被改变”。不知何故,环境正在改变数据(可能通过多任务、多线程或者中断处理),所以,volatile告诉编译器不要擅自作出有关该数据的任何假定,优化期间尤其如此。
如果编译器说:“我已经把数据读进寄存器,而且再没有与寄存器接触”。一般情况下,它不需要再读这个数据。但是,如果数据是volatile修饰的,编译器就不能作出这样的假定,因为这个数据可能被其他进程改变了,它必须重读这个数据而不是优化这个代码来消除通常情况下那些冗余的读操作代码。
就像建立const对象一样,程序员也可以建立volatile对象,甚至还可以建立const volatile对象,这个对象不能被客户程序员改变,但可通过外部的代理程序改变。下面的例子描述了一个类,这个类涉及通信硬件:
就像const一样,我们可以对数据成员、成员函数和对象本身使用volatile,可以对volatile对象调用volatile成员函数。
函数isr()不能像中断服务程序那样使用的原因是:在一个成员函数里,当前对象(this)的地址必须被秘密地传递,而中断服务程序ISR一般根本不要参数。为解决这个问题,可以让isr()是静态成员函数,这是第10章讨论的主题。
volatile的语法与const是一样的,所以对它们的讨论经常被放在一起。为指明可以选择两个中的任何一个,把它们连在一起通称为c-v限定词(c-v qualifier)。