我们经常使用“volatile”这个关键字,它是什么意思?
解析:volatile问题。
当一个对象的值可能会在编译器的控制或监测之外被改变时,例如一个被系统时钟更新
的变量,那么该对象应该声明成volatile。因此编译器执行的某些例行优化行为不能应用在已
指定为volatile的对象上。
volatile限定修饰符的用法与const非常相似——都是作为类型的附加修饰符。例如:
display_register是一个int型的volatile对象;curr_task是一个指向volatile的Task类对象的指
针;ixa是一个volatile的整型数组,数组的每个元素都被认为是volatile的;bitmap_buf是一个
volatile的Screen类对象,它的每个数据成员都被视为volatile的。
volatile修饰符的主要目的是提示编译器该对象的值可能在编译器未监测到的情况下被改
变,因此编译器不能武断地对引用这些对象的代码做优化处理。
答案:
volatile的语法与const是一样的,但是volatie的意思是“在编译器认识的范围外,这个数
据可以被改变”。不知什么原因,环境正在改变数据(可能通过多任务处理),所
以,volatile告诉编译器不要擅自做出有关数据的任何假定——在优化期间这是特别重要的。
如果编译器说:“我已经把数据读进寄存器,而且再没有与寄存器接触。”在一般情况下,它
不需要再读这个数据。但是,如果数据是volatile修饰的,编译器则不能做出这样的假定,因
为数据可能被其他进程改变了,编译器必须重读这个数据而不是优化这个代码。
就像建立const对象一样,程序员也可以建立volatile对象,甚至还可以建立const volatile
对象。这个对象不能被程序员改变,但可通过外面的工具改变。