2024年最新编程中什么情况下需要加 volatile?_什么时候用volatile(1),2024年最新如何在Golang-Studio下进行NDK开发

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

转载于无际单片机:
https://www.zhihu.com/question/31459750/answer/2677370021

最近有些想伙伴问在单片机c语言编程时volatile这个关键词怎么理解?有什么作用?

Volatile是C语言的一个关键字,在stm8和stm32的固件库里也会经常看见这个关键字的使用。

如果真的想理解透彻,可能要追溯到编译器优化机制cpu访问变量的原理。

这个可能需要花很多时间去研究,并不是很划算,我一直强调学习也要把控好投产比,也就是你投入研究的时间要和回报成正比。

很明显,对于一个开发者来说并不需要深入研究编译器优化代码的机制,至少我这么多年没深入研究过,也不影响我做产品。

很熟悉和只了解,同样都能实现功能,所花的时间成本却是天差地别的。

所以,我们只需要知道有编译器优化的概念,和cpu访问变量的原理就够了。

重点是记住volatile这个关键词的使用场景,什么时候必须要用!

一. CPU访问变量

1. 给变量赋值

img

我们看上图代码。

代码第一行定义了一个全局变量a,第6行把a赋值为1。

程序在执行的时候,首先会把1这个值赋值给cpu的寄存器里(比如R0-R7),然后再把寄存器里面这个1赋值到&a这个内存地址里。

这是给变量赋值的过程。

2. 读变量的值

img

代码第一行定义了两个全局变量a和b,第12行把变量a的值赋值给b。

程序在执行的时候,会先把a这个内存地址的值(也就是1)取出来先存到寄存器里,然后再把寄存器里的值存储到变量b的内存地址里。

这是读取变量值的过程。

二.编译器优化

1.上面程序执行过程有什么缺点?

我们可以再看一下上面那个代码,是不是觉得程序执行过程中第16行(&a内存地址->寄存器)的操作有点多余?

因为a的值已经存在寄存器里了,直接把寄存器的值存到变量b的内存地址里不就行了?

为什么还要重新从a的内存地址里重新取值到寄存器?有种脱裤子放屁的感觉对吧?

2.为什么要优化?

你能想到的,大聪明编译器肯定也能想到。

一般访问寄存器要比访问内存(RAM)的效率高。

所以,编译器也是基于这些规律特点,对我们写好的代码进行优化。

我们常用的开发工具Keil可以对优化等级进行设置,比如说Keil这个开发工具可以设置优化等级。

img

具体这几个优化等级有啥区别,大家可以自行百度下。

经过编译器代码优化以后,为了执行效率更高,执行这段程序的流程就会被优化。

最终程序执行可能就直接把寄存器的值赋值给变量b这个内存地址了,而不是重新从变量a的内存地址里读取到寄存器,这样效率就提高了。

编译器优化原则之一:减少对内存访问的次数,因为从内存里读写数据效率比较低。

三.volatile到底有什么用?用在什么场合?

如果这样被优化掉,会不会出现问题?哪些情况下会出现问题?

答案是有可能会,比如以下几种情况:

1.在执行b=a之前,发生中断,中断里把a的值改了

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

言开发知识点,真正体系化!**

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 15
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值