北京微信网站建设公司/抖音搜索引擎推广
对于这个关键字我们可能看了很多遍,确实也有很多写的很好的帖子,但是还是对这个关键字一知半解,因为这个知识点串联起来了很多不同的知识点,几乎每个知识点都是我们未知的领域,可能看到这个知识点之后对未知的没有去求解,这样的结果可能就是出现了新的问题之后,我们又对这个关键字进行了重新的定义。
对于比较官方的作用和说法是
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量在内存中的值,而不是使用保存在寄存器里的备份(虽然读写寄存器比读写内存快)
其实这种说法很难理解处volatile到底是干什么用的。
这里可以看一下这一篇文章,写的很详细。
volatile详解(任何人都能懂的那种)_乌克兰水晶小乳猪的博客-CSDN博客_volatile
上诉文章中,用汇编语句,改变内存里i的值,但是却不让编译器知道,就会发现在调试阶段,我们的编译器依旧会去内存里读取值,在release模式下,编译器对代码进行了优化,去寄存器里读取之前存储的值。
其中告诉了我们为什么要使用volatile,因为系统会把我们所写的局部变量,自动放在cpu 的寄存器里,有人就很好奇,为什么会自动放进寄存器里呢?因为读取寄存器里的变量比读取内存里的快,因为系统在某些时候,需要频繁的读取变量,如果这个时候每次都去内存里进行存取操作,就会耗费较多的时间,如果我们能够有效地利用CPU的寄存器,就会显著提升程序的运行效率。
所以为了防止我们的系统把我们所写局部变量自动添加到内存里我们一般会使用volatile进行声明。
由此可以得出寄存器变量是为了优化代码,提高程序的运行效率,而volatile是防止代码被优化,每次用到这个值的时候都回去内存中读取,而不是去寄存器礼。
什么是寄存器变量呢?
只有局部自动变量和形式参数才能够被定义为寄存器变量,全局和静态变量不能被定义为寄存器变量,而且,一个计算机中寄存器一般只有2-3个,故寄存器变量数量有限(编译程序会自动的将寄存器变量变为自动变量。受硬件寄存器长度的限制寄存器变量只能是char,int或者指针型,而不能使用其他复杂数据类型。)
由于register变量使用的是硬件CPU中的寄存器,寄存器变量无地址,所以不能使用取地址运算符"&"求寄存器变量的地址。
关键字register用来声明局部变量为寄存器变量。register型变量常被用于循环控制变量,这能充分体现它告诉特点实际不用声明变量。
同时感谢CSDN上所有博主和大佬,因为不是他们,我根本写不出这篇文章,虽然这篇是原创的,但是我是站在巨人肩膀上写出来的,里面有写的不对的地方希望大家能指正出来,不要给刚入门的人带来一些误区。
这篇创作原因是因为看到面试题里volatile的用法不甚理解,开始去翻阅,然后又引出了寄存器变量和c语言中的变量有三种类型:自动变量(automatic variable)、静态变量(static variable)和寄存器变量(register variable),希望以后能和大家一起学习,我是一个从前端调到嵌入式的无名小卒。
嵌入式笔试面试题目系列(汇总)_Zeal.Zhang的博客-CSDN博客_嵌入式驱动面试题
寄存器变量_谢中伟的博客-CSDN博客_定义寄存器变量
C——自动变量(automatic variable)、静态变量(static variable)和寄存器变量(register variable)_zhonguncle的博客-CSDN博客_自动变量