C语言学习笔记---volatile关键字
一段代码想要最终被计算机执行,首先需要被翻译成机器可识别和执行的指令,代码编译的过程往往包含几个步骤:
代码 -> 词法语法分析 -> 语义分析 -> 中间代码生成 -> 目标代码生成
在中间代码生成这个阶段,编译器会尝试对中间代码进行优化,通过减少无效或冗余的代码、计算强度优化等手段,以助于减少最终生成的指令数,或使用更高效的指令。也可认为由于内存访问速度远不及CPU处理速度,为提高机器整体性能,
(1)在硬件上: 引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。
(2)软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。
二、volitile的作用
用来修饰定义变量的,告诉编译器不要对定义的变量进行编译优化,如果你的程序开启了编译优化后运行不正常了,那首先就要排查下,是否正确的使用了这个关键字。
三、编译器优化加不加volitile的区别
(1) 设置编译器优化 汇编执行时,不会从内存中读取变量的最新值,只会一直使用第一次读取到的值。
(2) 不设置编译器优化 汇编执行时,每次都会实时的从内存中读取变量的最新值,保证变量的值是最新的。
四、volatile的使用场景
1、中断服务函数中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;