回顾下前面的const,代表的是常量声明,禁止被修改,那么有一些变量,非常特殊,需要频繁的改变,那么如何保证每次都是读取的最新的值呢?

C语言 const 搞不清楚?教你最简单的学习技巧!

这一节我们就来说说volatile关键字,这个单词的意思就是容易变化的,就是它是个变化无常的变量。

他代表修饰的变量,是会被某种方式改变,这个变化不是从代码端的,所以代码端这边就要注意,不能使用缓存数据,每次用这个数据的时候,都是需要从源头重新获取。

我们可以简单理解成,每次都需要更新数据,而不是用中间cache,volatile这个关键字就是干这个事。

而它的用途,一般在嵌入式常见,因为嵌入式有一堆外设,比如温度传感,或者是湿度检测,这些数据,都是实时在变化,它的变化最终对应的就是一个内存地址。

这个地址中的数据,被外界不断地修改。我们代码在获取的时候,就需要不断的循环,我们来看一段代码:

hello.c:

我们编译运行,然后objdump -S hello ,截取一段

我们关注这里的对于if(a==0),这边对应的汇编是:

cmpl $0x0,-0x4(%rbp)

然后我们把代码修改下:

我们加了关键字 volatile ,我们看下区别:

这里有变化,从之前的cmpl $0x0,-0x4(%rbp),变成了

mov    -0x4(%rbp),%eax

test   %eax,%eax

这里代码不认为这个0是固定的了,没用常数0作比较,而是用了重新读取内存中的数据,重新判断。

这便是它的意义,让每次的数据都能保证是最新的,而不是缓存中的。记住这点,基本就掌握了它。

那么 volatile 一般用在哪些地方呢?

1 外设寄存器对应的内存映射位置

2 中断服务使用的全局变量

3 并发多线程访问数据

这里强调一点,并不是说这个 volatile 能形成原子操作,这个理解是不对的,因为操作的数,要去看指令是否是不可中断的,如果是,这时候才是真的原子操作。

我们只需要记住,当我们的数据源是由外部改变的,这里比如温度采集器寄存器,这类就是不是程序去改的数据,外部采集来的,那么我们程序在用的时候,就需要每次去读取寄存器的值,这时候配置上 volatile,让编译器不要优化对应的变量,让每次从对应地址拿数据。

好了,这一节就说这一些,希望大家能够明白原理,这样子理解的更透彻。下一节我们说下关于计算机里面的一些抽象模型,分享一些我自己的总结学习技巧。

喜欢,帮忙转发~~

~~ end not end ~~

热门文章

零基础新手自学Python编程教程入门精通学习资料网站大全

自学编程C语言不迷路,我私藏的书单分享给你!

零基础新手学习算法Leetcode刷题指南

程序员码农IT工程师自学编程计算机入门进阶学习网站大全

程序员面试题宝典以及相关书籍下载!

计算机类常用电子书整理大全

职场老鸟,互联网十年从业生涯,分享 [Java,Python,安卓,AI,爬虫] 技术文章,学习资料, 热点趣闻等。关注回复 1024 Python 电子书大全 面试资料,给你一份私藏的程序员好礼,永远更新中!赶紧来关注哦!

我的微信 code_gg_boy 。

更多推荐

C语言volatile修饰的到底什么鬼?原来它在嵌入式开发是必须掌握的!