C++—volatile、mutable、explicit关键字

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修饰的构造函数的类,不能发生相应的隐式转换

猜你喜欢

转载自blog.csdn.net/qaaaaaaz/article/details/131147240