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

开发 后端
初学的读者可能不怎么关心编译器优化的功能,但对于经验丰富的工程师来说,掌握代码优化是必备技能。今天讲述的话题就是关于代码优化中,关键字volatile在优化过程中起到的作用。

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

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

一、关键字 volatile 是什么?

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

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

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

---来自百度百科

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

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

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

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

 

 

 

 

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

1.何时使用volatile?

常见使用volatile声明的情况:

  • 访问内存映射外设。
  • 在多个线程之间共享全局变量。
  • 在中断例程或信号处理程序中访问全局变量。

比如,在STM32代码中:

  1. #define     __O     volatile             /*!< Defines 'write only' permissions */ 
  2. #define     __IO    volatile             /*!< Defines 'read / write' permissions */ 

浏览代码,你会发现,很多地方都使用了“__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++编程
相关推荐

2011-06-14 13:26:27

volatile

2011-06-21 09:50:51

volatile

2022-06-29 08:05:25

Volatile关键字类型

2022-01-10 18:11:42

C语言应用技巧

2015-11-10 16:10:22

C语言StaticConst

2019-09-04 14:14:52

Java编程数据

2022-08-17 07:53:10

Volatile关键字原子性

2009-06-29 18:14:23

Java多线程volatile关键字

2023-06-26 08:02:34

JSR重排序volatile

2009-09-02 09:24:03

C# this关键字

2009-08-21 14:58:56

C# this关键字

2018-01-19 10:43:06

Java面试官volatile关键字

2011-05-17 13:04:20

Cconst

2009-08-13 13:04:29

C# lock关键字

2020-07-17 20:15:03

架构JMMvolatile

2024-03-15 08:18:25

volatileAtomic关键字

2009-08-13 17:44:34

C# using关键字

2009-08-06 17:52:23

C#增加that关键字

2009-08-26 15:16:29

C# lock关键字

2009-08-21 14:47:59

C# base关键字
点赞
收藏

51CTO技术栈公众号