内容摘抄自https://www.jb51.net/article/85852.htm,感谢原作者分享
volatile原意是“易变的”,但这种解释简直有点误导人,应该解释为“直接存取原始内存地址”
比较合适。
“易变”是相对与普通变量而言其值存在编译器(优化功能)未知的改变情况(即不是通过执行代码赋值改变其值的情况),而是因外在因素引起的,如多线程,中断等。编译器进行优化时,它有时会取一些值的时候,直接从寄存器里进行存取,而不是从内存中获取, 这种优化在单线程的程序中没有问题,但到了多线程程序中,由于多个线程是并发运行的,就有可能一个线程把某个公共的变量已经改变了,这时其余线程中寄存器的值已经过时,但这个线程本身还不知道,以为没有改变,仍从寄存器里获取,就导致程序运行会出现未定义的行为。并不是因为用volatile修饰了的变量就是“易变”了,假如没有外因,即使用volatile定义,它也不会变化。而加了volatile修饰的变量,编译器将不对其相关代码执行优化,而是生成对应代码直接存取原始内存地址。
一般说来,volatile用在如下的几个地方:
1. 中断服务程序中修改的供其它程序检测的变量需要加volatile;
2. 多任务环境下各任务间共享的标志应该加volatile;
3. 存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;
后续计划写一个C++例程,分析在优化后编译成的汇编指令(第二步用gdb调试探微…),本文待更新…