对于刚入门的朋友来说,代码优化可能不是首要关注的问题。然而对于那些经验丰富的开发者而言,掌握如何精细地调整代码已经成为了他们技能库中的一个重点。
现在,我们来探讨代码优化过程中一个非常关键的概念:volatile关键字及它在优化中的重要性。
一、深入理解volatile
volatile是一个用于修饰数据类型的标识符。
volatile的职责是充当一个命令关键字,保障该指令不会被编译器优化过程省略,同时确保每次操作都是直接从其所在内存地址中读取值。
当声明一个变量为volatile时,你告诉编译器这个变量可能会在任何时候被预料之外地修改,因此编译器不会对这个变量的值进行假设。
—参考自百度百科
很多人可能在课本中一次又一次地看到过volatile这个定义,但我敢肯定大多数人对其真正的意义缺乏深入的理解。
然而,只有当你开始亲自编码并投入实际项目的时候,你才能真正地理解volatile的深层含义并领会其应用的妙处。
二、volatile关键字对编译器优化的影响
我们都知道编译器有优化代码的功能,我们常用的集成开发环境(Keil、 IAR)都有优化选项。
如果不使用关键字volatile申明变量,则编译器可能会对变量的访问并生成非预期的代码或删除预期的功能。
1.何时使用volatile?
常见使用volatile声明的情况:
-
访问内存映射外设。 -
在多个线程之间共享全局变量。 -
在中断例程或信号处理程序中访问全局变量。
比如,在STM32代码中:
#define __O volatile /*!
#define __IO volatile /*!
浏览代码,你会发现,很多地方都使用了“__IO”,也就是volatile.
在跑系统的项目中,线程间共享的全局变量,建议都加上volatile关键字,这一点,很多人没有在意。
2.不使用volatile时可能出现的问题
如果未将变量用volatile声明,则编译器会假定其值不能在其定义的范围之外进行修改。
因此,编译器可能会执行不需要的优化。这可以通过多种方式表现出来:
-
在轮询硬件时,代码可能会陷入循环。 -
多线程代码可能会表现出奇怪的行为。 -
优化可能会导致删除实现故意时序延迟的代码。
举例:
自己写一个延时函数:
void Delay(int Cnt)
{
int i;
while(Cnt--)
{
i++;
for(i=0; i
你在不同优化等级情况下,延时时间可能会不一样;
同样的代码,你在Keil 和 IAR环境下编译出来的延时时间也可能不一样。
当然,更深入的理解就会牵涉到汇编代码,编译之后的汇编代码会比较直观的呈现差异。
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !