keil中变量设置为volatile为何还是会被优化

念念有余 2018-04-25 08:55:07
变量使用volatile修饰后应该不会被编译器优化的吧,但在keil中为何不是这样的呢?
优化等级设置为

但为什么还是会被优化呢
...全文
5024 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_34917812 2019-07-14
  • 打赏
  • 举报
回复 1
局部变量为什么不优化
  • 打赏
  • 举报
回复
只赋值没使用,也会优化!
zhujinqiang 2018-05-04
  • 打赏
  • 举报
回复
volatile修饰是告诉编译器, 这个变量有可能被其他子程序改变,所以不能从寄存器里读取变量的值,要从内存里读取。 就是说修饰的确实是一个变量,而且是一个“容易变”的变量。在每次取这个变量值的时候,要求不是取它上次在某个时候取的临时缓存变量(比如说暂存在某个寄存器中),而是直接到内存中取。 volatile变量能防止优化,别如说你在某个地方可能连续调用了好几次这个函数,于是编译器优化后,可能就调用一次,其他几次就采用这一次调用的返回值,而volatile修饰后,要让每一次都进行函数调用, 而不采用寄存器里的暂存值。 参考: https://blog.csdn.net/JK198310/article/details/14222713
jzen 2018-05-01
  • 打赏
  • 举报
回复
楼上说的都合理,但是我认为楼主对volatile的用法存在误解;volatile的关键字的核心意思是 修饰这个变量是“易变得”,也就是说 这个变量有可能被其他程序(其他线程或其他进程或硬件)改变,为了在本地同步这些改变而引入的一个关键词;目测楼主只运行了单一线程而且这个h也没有可能被硬件改到,因此其实使用不使用volatile都无关紧要。若果楼主这个函数可能同时被其他线程调用,也是没有影响的,因为h是局部变量;除非h是全局变量。因此建议楼主不要在这个问题上纠结了。
星野天河 2018-05-01
  • 打赏
  • 举报
回复
volatile是告诉计算机,除了程序外可能有其他程序或者硬件会改变变量,所以不要从寄存器里读取变量值,老老实实从内存里读取。
暗狼天使 2018-04-28
  • 打赏
  • 举报
回复
编译后,编译器输出窗口应该有对应的警告,你看一下就明白了,编译器根本就没有处理这些变量。
1586874907 2018-04-27
  • 打赏
  • 举报
回复
编译器只是优化了无任何意义的代码,你定义的变量h仍然是volatile类型的。 在每次引用到该变量的时候,都是直接从该变量的地址去现读的,而没有volatile修饰的变量引用会使用通用寄存器中保存的值,以提高code执行的效率。
dceacho 2018-04-26
  • 打赏
  • 举报
回复
楼上说的对,VOLATILE是防止读写优化,典型情况就是定时器里里更改变量,不用VOLATILE其他地方会认为该变量没更改 你代码是在逻辑上被优化掉了,h,d编译器没发现任何会受h,d变化影响的地方,所以直接最后一步了
fly 100% 2018-04-26
  • 打赏
  • 举报
回复
volitale 是防止内存不一致为题,编译器编译每次这个变量都需要去内存读取和写入,防止优化的话可以把这个变量值写入内存或者加内存屏障
  • 打赏
  • 举报
回复
编译器会做代码优化, 开始的h=1,h=2并没有任何意义, 编译器会优化掉,只保留最后的h=3

27,514

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧