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

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。


  • 21
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

根号五

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值