关注、星标公众,不错过精彩内容

初学的朋友可能不怎么关心优化选项,但对于经验丰富的工程师来说,掌握代码优化是必备技能。

今天讲述的话题就是关于代码优化中,关键字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环境下编译出来的延时时间也可能不一样。

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

推荐阅读:

1.如何将变量存储在指定内存地址(基于Keil MDK-ARM)

2.ARM针对Cortex-M处理器推出一套安全系统:Arm FuSa RTS

我的知乎:strongerHuang

我的网站:www.strongerhuang.com

关注公众号『strongerHuang』,在底部菜单中查看更多精彩内容!

长按识别图中二维码关注

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

  1. ARM嵌入式编译器-volatile关键字对编译器优化的影响

    volatile限定符告知计算机,其他agent(而不是变量所在的程序)可以改变该变量的值.通常它被用于硬件地址以及在其他程序或同时运行的线程中共享数据.要求编译器不要对其描述的对象作优化处理,对它的 ...

  2. 【转】volatile关键字。编译器不优化,多线程会改。防止随时变动的

    [转]volatile关键字.编译器不优化,多线程会改.防止随时变动的 来自:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/177743 ...

  3. volatile关键字及编译器指令乱序总结

    本文简单介绍volatile关键字的使用,进而引出编译期间内存乱序的问题,并介绍了有效防止编译器内存乱序所带来的问题的解决方法,文中简单提了下CPU指令乱序的现象,但并没有深入讨论. 以下是我搭建的博 ...

  4. C语言 使用数组索引与指针索引 在循环中对编译器优化的影响及耗时分析

    C语言在访问数组时既可以使用如a[i]这样的下标方式,也可以使用*(a+i)这样的指针方式,理论上完全等价.但是在编译器对循环作优化时,对于指针方式的索引很有可能分析不彻底,因此相比数组索引耗时有所增 ...

  5. [C#.NET 拾遗补漏]10:理解 volatile 关键字

    要理解 C# 中的 volatile 关键字,就要先知道编译器背后的一个基本优化原理.比如对于下面这段代码: public class Example {public int x;public voi ...

  6. volatile关键字

    [转自:http://hi.baidu.com/limp_t/blog/item/176bf10e0d65e0c97bcbe187.html] volatile关键字是一种类型修饰符,用它声明的类型变 ...

  7. C语言volatile关键字—最易变的关键字

    volatile 是易变的.不稳定的意思.很多人根本就没见过这个关键字,不知道它的存在.也有很多程序员知道它的存在,但从来没用过它.我对它有种"杨家有女初长成,养在深闺人未识" 的 ...

  8. 为什么我们使用volatile关键字? [重复]

    本文翻译自:Why do we use volatile keyword? [duplicate] Possible Duplicate: 可能重复: C++: When Has The volati ...

  9. java 中violate_Java中的volatile关键字及Cache更新

    Volatile [ˈvɑːlətl],中文解释:反复无常的,易变的,不稳定的. volatile的本意是告诉编译器,此变量的值是易变的,每次读写该变量的值时务必从该变量的内存地址中读取或写入,不能为 ...

最新文章

  1. 深入分析JVM逃逸分析对性能的影响
  2. sama5d3 环境检测 gpio--yk测试
  3. 用VBA得到EXCEL表格中的行数和列数
  4. 怎样安装php52-71,CentOS如何安装PHP5和PHP7
  5. C#中HTML和UBB互相转换的代码
  6. 分布式系统以及CAP原理
  7. mfc切换office样式_干货搬运工|计算机二级office必读,裸考也能通关的宝典
  8. 为什么vue-loader设置transformasseturls无效_拓展训练中“常见的无效提问”
  9. 影响中国软件开发20人
  10. 使用网易云api、Vue 和swiper实现轮播图 (音乐app项目-第2步)
  11. dirent struct_struct dirent中d_name长度问题
  12. 利用c语言在屏幕上打印出窗口,南开19春学期(1709、1803、1809、1903)《计算机应用基捶在线作业...
  13. Pocket PC访问PC上的Webservice
  14. 名企招聘面试考题集锦
  15. 实时数据库,内存数据库,关系型数据库比较
  16. 数据分享|R语言关联规则挖掘apriori算法挖掘评估汽车性能数据
  17. matlab求半衰期,如何使用GLD和GDX价差来估计均值回归的半衰期
  18. Power BI 关于日期显示格式的那些事儿
  19. ORB-SLAM2的源码阅读(六):KeyFrameDataBase类
  20. 处理 程序异常崩溃后的善后工作

热门文章

  1. AD原理图库元件标识等字符上方的横线
  2. 智商捉急人士求金融数学与matlab相关指导
  3. 赢得阵亡将士纪念日的十大怪异项目
  4. 数据处理方法-算数编码
  5. oracle where 后面的条件中|| 是什么意思
  6. closet的汉语_closet是什么意思_closet的翻译_音标_读音_用法_例句_爱词霸在线词典...
  7. 定位及元素的显示和隐藏
  8. 2020年B证(安全员)考试及B证(安全员)多少钱
  9. 先别急着练速写,人物慢写才是第一步
  10. asp.net 中Button按钮失效问题解决办法