volatile修饰符主要目的是提示编译器该对象的值可能在编译器未检测到的环境下被改变,例如一个被系统时钟更新的变量,则该对象应该声明成volatile,则该编译器在执行某些例行化行为时就不能应用在被volatile修饰的变量上。
面试时的经典回答:一个定义为volatile的变量可能会被意想不到的改变,那么,编译器就不会去假设这个变量的值了 ,精确地说就是,优化器在用到这个变量的时候必须每次都小心的从内存中拿值,而不是使用保存在寄存器里的变量。
以下是使用volatile的几个例子:
1:并行设备的硬件寄存器(如状态寄存器)。
2:一个中断服务子程序中会访问到的非自动变量。
3:多线程应用中被几个任务共享的变量。
一个参数可以既是const又可以是volatile吗?一个指针可以是volatile吗?
可以,可以。
第一种情况,一个例子是只读状态寄存器。第二种情况是:一个中断服务子程序修改一个指向buffer的指针时。