共计 588 个字符,预计需要花费 2 分钟才能阅读完成。
volatile 限定符
直接处理硬件的程序常具有这样的数据成员,它们的值由程序本身直接控制之外的过程所控制。例如程序可以包含系统时钟更新的变量。当可以用编译器的控制或检测之外的方式改变对象值的时候,应该将对象声明为 volatile
。关键字volatile
时给编译其的指示,指出对这样的对象不应该执行优化。
当要求使用 volatile
声明变量的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。其作用是让每次操作该变量时一定要从内存中真正取出,而不是使用已经存在寄存器中的值。
注意事项:
volatile
的确切含义与机器有关,只能通过阅读编译器文档来理解。使用volatile
的程序在移到新的机器或编译器时通常必须改变。- 只能将
volatile
对象的地址赋给指向volatile
的指针。 - 除了基本类型外,对用户定义的类型也可以用
volatile
类型进行修饰; - C++ 中有一个
volatile
标识符的类只能访问它的接口的子集,一个由类实现者控制的子集。用户只能用const_cast
来获得对类型接口的完全访问。此外volatile
向 const 一样会从类传递到它的成员。
使用原则:
- 存储其映射的硬件寄存器,接口传输的变量;
- 中断服务程序中修改的供其他程序检测的变量;
- 多任务环境下各任务间共享的
flag
等变量;
参考:C++ Primer(第 5 版)
IT 内容具有时效性,未避免更新后未同步,请点击查看最新内容:volatile 限定符
文章首发于:http://nebofeng.com/2021/04/12/volatile-%e9%99%90%e5%ae%9a%e7%ac%a6/
文章首发于:http://nebofeng.com/2021/04/12/volatile-%e9%99%90%e5%ae%9a%e7%ac%a6/
正文完
欢迎关注个人公众号, 内含各种工具及大厂内推码合集