高速缓存提升c语言速度_嵌入式开发《C语言(十:2分钟搞懂关键字volatile)》

在文章 嵌入式Linux开发《C语言专题(十:彻底搞懂“关键字”const)》和嵌入式Linux开发《C语言专题(十:彻底搞懂“关键字”static)》和嵌入式开发《C语言(十:5分钟搞懂“关键字”register&extern)》和嵌入式开发《C语言(十:5分钟搞懂“关键字”sizeof)》和嵌入式开发《C语言(十:搞懂typedef“关键字”so easy)》中对关键字const、static、register、extern和typedef做了详细的总结。这篇文章将详细介绍volatile关键字的使用。通过这篇文章将学会看懂和使用volatile关键字。

这个关键字非常简单,只要搞清楚在哪些场景下加与不加就可以。

volatile字面意思是“可变的,易变的”,也就是说用它修饰的变量的值是可以变化的。在多线程的编程中对共享变量的访问和在中断服务程序中修改其他程序中的变量以及对对特定寄地址的读写访问时经常使用这个变量。用法就是在原来定义变量的前面加上vloatile修饰符即可:比如vlolatile int i = 10;

如果一个变量的前面加上volatile这个类型修饰符,就表明编译器在访问这个变量时不对这个变量进行优化操作,也就是说编译器每次在使用这个这个变量时都会从内存中重新读取变量的值。这样做会降低一定的效率,因此在合适的场景下再使用这个修饰符,并不是在每一个变量的前面加上这个修饰符。

我们知道嵌入式系统的硬件层包含寄存器、内存、辅存(硬盘等)和高速缓存。CPU对这些访问的速度是不一样的,速度由快到慢以此是寄存器->高速 缓存->内存->硬盘 通常cpu在访问相应数据时,首先会到缓存中看有没有,没有的话再到内存中读取。因此,只要未加volatile修饰符的变量在频繁被使用时,CPU会去高速缓存中读取相应值。也有人问,既然CPU访问寄存器的速度最快,那么为什么 不将内存、缓存、辅存全部换为寄存器?烧钱啊,访问寄存器速度快但是容量小,访问硬盘速度相对慢但是容量大。所以每一种的存储介质都是有利有弊。演示代码如下图所示:

#include //演示未加volatile关键字int main(int argc, char** argv){unsigned int i = 1;unsigned int j = i;//执行此处代码时会将变量i的值存储到高速缓存中//此时在进行k = i赋值操作时,i的值并不是从内存中取出,而是从高速缓存中取出。//如果变量i的值在别的线程中修改了,那么此时高速缓存中的i的值就不对了//因此在多线程编程中对共享变量操作时,一定要对变量加上volatile修饰符。unsigned int k = i;return 0;}
371f6857575e5689cebfa5511e2771b5.png
#include //演示加volatile关键字int main(int argc, char** argv){volatile unsigned int i = 1;//加上volatileunsigned int j = i;//加上volatile此时在进行k = i赋值操作时,i的值从内存中取出,而非从高速缓存中取出。//如果变量i的值在别的线程中被修改了,也会刷新到内存,那么此时从内存中取值就对了unsigned int k = i;return 0;}
511f2006dea26c2be1de579ca8c2a483.png

以上就是所总结的volatile的用法,这些都是必须要掌握的,上机实战,理解才是王道

喜欢的话给个点赞转发,更多精彩内容可以关注此头条号:嵌入式软硬件开发 或者加入嵌入式C语言交流群 932029691 相互交流,共同成长。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值