文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-10 16:30

关注

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

一、关键字 volatile 是什么?

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

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

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

---来自百度百科

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

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

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

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

 

 

 

 

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

1.何时使用volatile?

常见使用volatile声明的情况:

比如,在STM32代码中:

  1. #define     __O     volatile              
  2. #define     __IO    volatile              

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

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

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

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

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

举例:

自己写一个延时函数:

  1. void Delay(int Cnt) 
  2.   int i; 
  3.  
  4.   while(Cnt--) 
  5.   { 
  6.     i++; 
  7.     for(i=0; i<10; i++); 
  8.   } 

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

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

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

 

来源:C语言与C++编程内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯