C语言 volatile 关键字在编译优化过程中有何作用
小职 2020-09-24 来源 : 阅读 859 评论 0

摘要:本篇讲述的话题就是关于C语言代码优化中,关键字volatile在优化过程中起到的作用。希望对C语言有更深入的了解。

本篇讲述的话题就是关于C语言代码优化中,关键字volatile在优化过程中起到的作用。希望对C语言有更深入的了解。

C语言 volatile 关键字在编译优化过程中有何作用

初学的读者可能不怎么关心编译器优化的功能,但对于经验丰富的工程师来说,掌握代码优化是必备技能。

 

今天讲述的话题就是关于代码优化中,关键字volatile在优化过程中起到的作用。

 

一、关键字 volatile 是什么?

 

volatile是一个类型修饰符(type specifier)。

 

volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。

 

volatile变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。

 

---来自百度百科

 

volatile的定义,应该在(读书)学习时都看过无数遍,但我相信绝大部分人都没有深刻理解其中含义。

 

当你真正编程、开发项目之后,你就会进一步理解其中含义。

 

二、volatile关键字对编译器优化的影响

 

我们都知道编译器有优化代码的功能,我们常用的集成开发环境(Keil、 IAR等)都有优化选项。

 

 

如果不使用关键字 volatile 申明变量,则编译器可能会对变量的访问并生成非预期的代码或删除预期的功能。

 

1.何时使用volatile?

 

常见使用volatile声明的情况:

 

访问内存映射外设。

在多个线程之间共享全局变量。

在中断例程或信号处理程序中访问全局变量。

比如,在STM32代码中:

 

#define     __O     volatile             /*!< Defines 'write only' permissions */

#define     __IO    volatile             /*!< Defines 'read / write' permissions */

浏览代码,你会发现,很多地方都使用了“__IO”,也就是volatile.

 

在跑系统的项目中,线程间共享的全局变量,建议都加上volatile关键字,这一点,很多人没有在意。

 

2.不使用volatile时可能出现的问题

 

如果未将变量用volatile声明,则编译器会假定其值不能在其定义的范围之外进行修改。

 

因此,编译器可能会执行不需要的优化。这可以通过多种方式表现出来:

 

在轮询硬件时,代码可能会陷入循环。

多线程代码可能会表现出奇怪的行为。

优化可能会导致删除实现故意时序延迟的代码。

举例:

 

自己写一个延时函数:

 

void Delay(int Cnt)

{

  int i;

 

  while(Cnt--)

  {

    i++;

    for(i=0; i<10; i++);

  }

}

你在不同优化等级情况下,延时时间可能会不一样;

 

同样的代码,你在Keil 和 IAR环境下编译出来的延时时间也可能不一样。

 

当然,更深入的理解就会牵涉到汇编代码,编译之后的汇编代码会比较直观的呈现差异。




关注“职坐标在线”公众号,免费获取学习干货资源!


本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程