C语言32个关键字
有32个关键字详细说明,还有跳转链接!
一、volatile 简介
volatile是一个特征修饰符,是用来修饰易变的变量。
易变是因为外在因素引起的,像多线程、中断等。。。
表明某个变量的值可能在外部被改变,因此对这些变量的存取不能缓存到寄存器,每次使用时需要重新读取内存。
编译器优化:编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以消除一些代码。但有时这些优化不是程序所需要的,这时可以用volatile修饰,禁止编译器优化。
二、volatile 使用地方
- 中断服务程序中修改的供其它程序检测的变量需要加volatile;
- 多任务环境下各任务间共享的标志应该加volatile;
- 存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;
三、volatile 举例说明
举例1:
int MQ;
MQ=0;
MQ=1;
MQ=2;
MQ=3;
对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器却会对上述四条语句进行优化,认为只有MQ=3;(即忽略前三条语句,只产生一条机器代码)。
如果键入volatile,则编译器会逐一地进行编译并产生相应的机器代码(产生四条代码)。
举例2:
for(int i=0; i<100000; i++);
这个语句用来测试空循环的速度的
但是编译器肯定要把它优化掉,根本就不执行。
改成下面:
for(volatile int i=0; i<100000; i++);
就会执行。
四、volatile 问题
- 一个参数既可以是const还可以是volatile吗?
可以的,例如只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。 - 一个指针可以是volatile 吗?
可以,当一个中服务子程序修该一个指向一个buffer的指针时。
注意:频繁的使用volatile很可能会增加代码的尺寸和降低性能,因此要合理的使用volatile。