C语言:关键字---volatile(声明易变变量)

C语言:关键字---volatile(声明易变变量),第1张

C语言32个关键字
有32个关键字详细说明,还有跳转链接!


一、volatile 简介

volatile是一个特征修饰符,是用来修饰易变的变量。


易变是因为外在因素引起的,像多线程、中断等。



表明某个变量的值可能在外部被改变,因此对这些变量的存取不能缓存到寄存器,每次使用时需要重新读取内存。

编译器优化:编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以消除一些代码。

但有时这些优化不是程序所需要的,这时可以用volatile修饰,禁止编译器优化。

二、volatile 使用地方
  1. 中断服务程序中修改的供其它程序检测的变量需要加volatile;
  2. 多任务环境下各任务间共享的标志应该加volatile;
  3. 存储器映射的硬件寄存器通常也要加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 问题
  1. 一个参数既可以是const还可以是volatile吗?
    可以的,例如只读的状态寄存器。

    它是volatile因为它可能被意想不到地改变。

    它是const因为程序不应该试图去修改它。

  2. 一个指针可以是volatile 吗?
    可以,当一个中服务子程序修该一个指向一个buffer的指针时。

注意:频繁的使用volatile很可能会增加代码的尺寸和降低性能,因此要合理的使用volatile。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/673401.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-19
下一篇2022-04-19

发表评论

登录后才能评论

评论列表(0条)

    保存