volatile
- 用它声明的类型变量表示可以被某些编译器的未知因素更改。
比如,操作系统、硬件或其他其它线程等,一个变量被这个关键字声明之后,编译器访问该变量的代码的时候就不会再进行优化,系统总是重新从它所在的内存读取数据,而不是读寄存器内的备份。
多线程中被几个任务共享的变量需要定义为volatile类型。
volatile用在如下几个地方
- 中断服务程序中修改的供其他程序检测的变量需要加volatile
- 多任务环境下各任务之间共享的标志应该加volatile
- 存储器映射的硬件寄存器通常也要加volatile,因为每次对它的读写都可能有不同的意义。
多线程下的volatile
当两个线程都要用到某一个变量,而且这个变量的值会被改变的时候,应该用volatile声明,防止优化编译器把变量从内存装入CPU寄存器中。
注意
可以把一个非volatile int赋给volatile int,但是不能把非volatile对象赋给一个volatile对象
- volatile int 和 int 都是基本类型,它们的大小和对齐方式是相同的,所以可以直接赋值。
- volatile对象 和 非volatile对象 可能是用户自定义类型,它们的大小和对齐方式可能不同,所以不能直接赋值。
- volatile对象 的赋值操作可能涉及到特殊的内存操作,比如存储器映射的硬件寄存器,所以不能用普通的赋值语句。
C++中一个有volatile标识符的类只能访问它接口的子集,一个由类的实现者控制的子集。
用户只能用const_cast来获得对类型接口的完全访问,此外volatile像const一样,会从类传递到它的成员。
mutable
有时候,我们需要在const函数里面修改一些跟类状态无关的数据成员,那么这个函数应该被mutable来修饰,并且放在函数后面关键字的位置 。
explicit
explicit关键字只能用于类内部的构造函数声明上传,被explicit修饰的构造函数的类,不能发生相应的隐式转换。