0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关键字volatile是什么?volatile关键字对编译器优化的影响

Dp1040 来源:strongerHuang 2023-11-03 11:47 次阅读

在我的技术交流群里,经常会看到大家讨论一些“奇怪”的问题,其中有好几次我都发现,是他们全局变量“惹的祸”,问题就是全局变量被优化导致的。

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

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

关键字volatile是什么?

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

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

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

---来自百度百科

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

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

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

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

473fd922-79e1-11ee-939d-92fbcf53809c.jpg

如果不使用关键字 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环境下编译出来的延时时间也可能不一样。

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

本文转载自strongerHuang

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48629
  • 关键字
    +关注

    关注

    0

    文章

    37

    浏览量

    6843
  • volatile
    +关注

    关注

    0

    文章

    44

    浏览量

    12954

原文标题:全局变量加/不加volatile的影响

文章出处:【微信号:玩点嵌入式,微信公众号:玩点嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    关键字搜索文件夹中某个TXT文件

    文件夹中随时创造TXT文件,如何及时选出刚创造的文件?或关键字搜索出需要的TXT文件?
    发表于 02-06 15:22

    在NVM和本地\"内存中定义数组(静态 /global /local)的\"关键字是什么?

    在 NVM 和本地\"内存中定义数组(静态 /global /local)的\"关键字是什么? 还有与 32 位对齐的关键字怎么样。
    发表于 01-25 07:52

    探讨多线程编程中的volatile关键字应用

    有时候,我们可能需要在指针类型之间进行转换,而编译器会认为这是不安全的操作,从而导致编译错误。使用volatile关键字可以告知编译器,这个
    发表于 12-27 13:53 197次阅读

    你还记得这个C语言关键字吗?

    当你使用volatile关键字时,你告诉编译器该变量的值可能会在程序的执行过程中被外部因素更改,因此编译器不应该对该变量的读写进行优化。下面
    的头像 发表于 12-17 08:00 174次阅读
    你还记得这个C语言<b class='flag-5'>关键字</b>吗?

    IAR能否在整个工程中搜索关键字

    像mdk可以在整个工程中搜索关键字 IAR应该也有类似的功能吧,但是我貌似没有找到
    发表于 11-08 07:21

    指向code区数组的指针需不需要加code关键字的声明?

    指向code区数组的指针需不需要加code 关键字的声明?
    发表于 11-02 06:16

    在嵌入式中定义变量时volatile关键字的作用是什么?

    在嵌入式中定义变量时volatile关键字的作用?
    发表于 10-24 07:50

    程序中变量加volatile关键字是做什么用途的?

    为什么变量定义要加上这个关键字
    发表于 10-13 07:15

    如何使用机器学习在M480上执行关键字识别

    应用程序: 本样本代码使用机器学习来在 M480 上执行关键字识别。 BSP 版本: M480系列 BSP CMSIS V3.04.000 硬件: NuMaker-PFM-M487 VER 3.0
    发表于 08-29 06:46

    使用机器学习在M480上执行关键字识别

    应用程序: 本样本代码使用机器学习来在 M480 上执行关键字识别。 BSP 版本: M480系列 BSP CMSIS V3.04.000 硬件: NuMaker-PFM-M487 VER 3.0
    发表于 08-22 08:02

    C++中常用关键字详解(2)

    在C++中,volatile是一个关键字,用于修饰变量,告诉编译器该变量的值可能在程序流程之外被意外修改,因此编译器不应该对该变量进行优化
    发表于 08-08 16:15 191次阅读

    volatile关键字的用途

    当同一全局变量在多个线程之间被共享时,有可能会出现同步错误,编译器可能会将访问该全局变量的代码优化为访问某个寄存器,而不会再次访问相应的内存,导致程序运行错误。
    发表于 06-07 10:22 259次阅读

    const关键字应用总结

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性
    的头像 发表于 05-26 09:06 368次阅读

    AT组件怎么解析无前缀关键字的数据?

    一开始想利用解析函数,at_resp_get_line,at_resp_parse_line_args等等去读取,单都需要关键字前缀匹配才行,且一次只能读一行。而我的数据是在下一行,且无前缀,所以我不知道要怎么读取这个data出来。 望各位大佬帮忙指点!感谢! 图如下:
    发表于 05-12 16:44

    volatile的实现原理分析

    `volatile`是一个轻量级的`synchronized`,一般作用于 **变量** ,在多处理器开发的过程中保证了内存的可见性。相比于`synchronized`关键字,`volatile`
    的头像 发表于 05-11 17:33 465次阅读
    <b class='flag-5'>volatile</b>的实现原理分析