volatile到底有什么用?和regist有什么区别?
发布日期:2021-06-30 10:11:51
浏览次数:3
分类:技术文章
本文共 870 字,大约阅读时间需要 2 分钟。
volatile
也是个单词嘛,解释是易变的,不稳定的,也就是定义为volatile的变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。即 优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
具体例子: 1)并行设备的硬件寄存器(如状态寄存器)
2)一种中断服务子程序中会访问到底额非自动变量。
3)多线程应用中被几个任务共享的变量。
以上都是在嵌入式工程师的最基本的问题,在和硬件,中断打交道的,不懂volatile就是灾难。
以下是关于volatile的小问题:
1). 一个参数既可以是 const 还可以是 volatile 吗?例如const volatile int a;解释为什么。 2). 一个指针可以是 volatile 吗?解释为什么。
1) 如果一个变量不会被本程序改变,通常可能给它加上const,但如果该变量可能被其他程序改变而本程序又在检测这个变量的值,就需要给它加上volatile,于是变量就同时有volatile和const了。
2)可以,一个例子是当一个中服务子程序修该一个指向一个 buffer 的指针时。
register
在函数内部定义变量时,默认是auto类型,即分配给变量内存。如果定义一个变量用register关键字,那么编译器尽可能把变量存放在CPU内部寄存器中,这样就不必通过内存寻址来访问变量,提高访问效率。 当然使用register来修饰的变量必须是可以存放在寄存器栈中的。这么说寄存器和栈是不对的,学过就知道了,寄存器是CPU的组成部分。他们告诉的栈在内存的什么地方,也就是地址。
正确地说,register修饰的变量必须是CPU可以接受的类型,像全局静态变量是不行的。
而且也不能过多的定义变量,因为存放在寄存器的数量是有限的啦
不同
volatile是易变的,所以不允许被放入寄存器中,每次使用都要重新读取,但register要尽量放在寄存器,提高效率,目前好多编译器的优化都比较好,使用register的必要性不高。
转载地址:https://islet.blog.csdn.net/article/details/75734347 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
表示我来过!
[***.240.166.169]2024年04月29日 05时12分14秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
oracle加密存储过程(函数、包)
2019-04-30
linux安装禅道
2019-04-30
glassfish服务器的安装和使用
2019-04-30
oracle数据库RMAN备份篇
2019-04-30
小程序调用系统照相机
2019-04-30
Mysql学习笔记
2019-04-30
java编码解码工具类
2019-04-30
snaker获取所有的流程定义
2019-04-30
mysql查找字符串函数
2019-04-30
wbox弹窗插件
2019-04-30
jsp自定义标签
2019-04-30
mysql授权grant语句中的with with_option
2019-04-30
mysql日志管理
2019-04-30
mysql导出到文本文件(select ... into outfile)
2019-04-30
mysql文本文件导入到数据库
2019-04-30
docker安装nginx
2019-04-30
docker部署nginx
2019-04-30
docker安装php
2019-04-30
docker安装tomcat
2019-04-30
docker容器里无法使用vi命令
2019-04-30