首页 > 编程知识 正文

c语言volatile场景,java volatile关键字

时间:2023-05-05 05:12:42 阅读:145450 作者:1769

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

今天的话题是关于关键字volatile在代码优化中的作用。

一、关键词volatile是什么? volatile是类型限定符。

volatile的作用是作为指令的关键字,通过编译器的优化不省略该指令,每次都需要直接读取值。

volatile变量是指变量可能会意外更改,编译器不假设变量值。

-来自百度百科

volatile的定义在学习中应该看过很多次,但是我想大多数人都没有深刻理解它的意思。

威武的犀牛实际编程和开发项目后,其含义会得到进一步理解。

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

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

如果不使用关键字volatile声明变量,编译器可能会访问变量以生成意外代码或删除意外功能。

何时使用volatile?

经常使用volatile宣言时:访问内存映射外围设备。

在多个线程之间共享全局变量。

通过中断例程或信号处理程序访问全局变量。

例如,在STM32代码中:

#define__Ovolatile/*!

通过代码,可以看到很多地方都在使用“__IO”,即volatile。

在系统中运行的项目中,建议在线程之间共享的全局变量中使用volatile关键字,这一点很多人并不介意。

不使用volatile可能出现的问题

如果变量未在volatile中声明,编译器假设该值不能在定义的范围之外更改。

因此,编译器可能会执行不必要的优化。 这可以用各种各样的方法来表现。 轮询硬件可能会导致代码陷入循环。

多线程代码可能会显示奇怪的行为。

优化可能会删除导致有意定时延迟的代码。

示例:

自己写延迟函数:

voiddelay(intCNT ) {int i; while(CNT---- ) I; for(I=0; i10; I; }

延迟时间可能因优化级别而异

即使是同一代码,在Keil和IAR环境中编译的延迟时间也可能不同。

当然,更深入的理解涉及汇编代码,编译后的汇编代码在直观上表现出差异。

文章来源于stronger黄,作者stronger黄

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。