社区
C语言
帖子详情
变量前加volatile 是什么意思啊
llw1318
2010-05-28 07:54:43
网上说是直接从内存里取,这是什么意思,程序中变量的保存难道还有不是在内存中放的吗,还可以放在寄存器?哪位高手给帮忙详细说明下啊,谢谢
...全文
360
14
打赏
收藏
变量前加volatile 是什么意思啊
网上说是直接从内存里取,这是什么意思,程序中变量的保存难道还有不是在内存中放的吗,还可以放在寄存器?哪位高手给帮忙详细说明下啊,谢谢
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
某某9
2010-05-29
打赏
举报
回复
[Quote=引用 13 楼 mostmark 的回复:]
volatile易变的,加上后编译器不会对其进行优化
主要用在三个方面
1 多线程共享的全局变量
2 中断程序
3 状态寄存器
比如一个状态寄存器你连续读取两次, int netconf_1, netconf_2;
netconf_1 = *(int * )0x56000004;
……
[/Quote]
volatile是声明该变量是易变的
mostmark
2010-05-29
打赏
举报
回复
volatile易变的,加上后编译器不会对其进行优化
主要用在三个方面
1 多线程共享的全局变量
2 中断程序
3 状态寄存器
比如一个状态寄存器你连续读取两次, int netconf_1, netconf_2;
netconf_1 = *(int * )0x56000004;
netconf_2 = *(int * )0x56000004;
很可能就会被优化成 netconf_2 = netconf_1 = *(int *)0x56000004;
但是这可能不是你想要的,因为在读取的过程中状态寄存器内容会被硬件自动改写的,可能是不容的值
cxxer
2010-05-29
打赏
举报
回复
易失性变量。
ccdxjjxy
2010-05-29
打赏
举报
回复
防止被编译器优化,它的值只能被硬件去修改
mzlogin
2010-05-28
打赏
举报
回复
我见过它几回都是在多线程编程中,
对它的理解也如楼上的几位讲的,
是说对它不作优化,不存储在寄存器中,
每次都是直接读取它本身。
东莞某某某
2010-05-28
打赏
举报
回复
确实 硬件里有用到 一般用不到
volatile网上介绍的很详细啦
happytang
2010-05-28
打赏
举报
回复
这个东西我从来没用过
呵呵
请看看c专家编程里面的说明
jldream110
2010-05-28
打赏
举报
回复
volatile是声明该变量是易变的, 编译器把常用的值放在寄存器里了 所以用的时候 直接在寄存器里取上一次用的值了 ,可是因为这个变量是易变的 所以可能这种在寄存器取值的优化处理会带来错误 。 因此加上volatile告诉编译器这个变量是易变的 必须每次使用都即时的去该变量的内存中读取 这样就会保证实时性和正确性。这个在嵌入式里 用的比较多
ArtiFly2000
2010-05-28
打赏
举报
回复
表示这个变量的值可能被其它程序改变,
这种变量的值,编译器不会使用寄存器缓存,而是每次都到内存去读,以能读到被其它程序改变之后的最新值
jldream110
2010-05-28
打赏
举报
回复
volatile是声明该变量是易变的, 编译器把常用的值放在寄存器里了 所以用的时候 直接在寄存器里取上一次用的值了 ,可是因为这个变量是易变的 所以可能这有寄存器的优化处理会带来错误 因此加上volatile告诉编译器这个变量是易变的 必须每次使用都即时的去改变量的内存中读取 这样就会保证实时性和正确性。这个在嵌入式里 用的比较多
pengzhixi
2010-05-28
打赏
举报
回复
防止编译器优化将变量的值直接从在寄存器里面取值,加上这个关键词,以后每次读取该变量的值都需要从它的内存中去读取
qq120848369
2010-05-28
打赏
举报
回复
[Quote=引用 2 楼 joanlynnlove 的回复:]
学习。。。
[/Quote]
同学习.今天论坛是否在维护.那个游戏我玩了1分钟
acdbxzyw
2010-05-28
打赏
举报
回复
学习。。。
sduxiaoxiang
2010-05-28
打赏
举报
回复
olatile关键字指定其后的名称相关的值可以通过不是用户应用中的那些动作而进行修改,因此,volatile关键字对在可被多个过程访问的共享存储器中或与中断服务例程通讯用的全局数据区域中说明对象是非常有用的。当一个名称被说明为volatile时,编译器在它每次被程序访问时从存储器中重新装入其值,这极大地降低了可能的优化。
C语言关键字
volatile
的作用
C语言的关键字,
volatile
,表示易变的数据,这个
变量
前面加上
volatile
是一个安全保障措施,加上这个关键字的目的就是防止编译器优化.编译器优化如果设置为最低的时候,这个关键字没有用,如果提高优化等级,这个关键字是有用的.编译器优化是去除冗余代码,但是去除无用的繁杂代码,降低代码空间,提升运行效率,但是有时候编译器的优化会弄巧成拙.对
变量
加上
volatile
就是告诉编译器,无论干什么都原封不动的去执行,避免优化掉了.
java中
volatile
变量
是什么?
volatile
变量
和atomic
变量
有什么不同?
java中
volatile
变量
是什么?
volatile
变量
和atomic
变量
有什么不同?
STM32 全局
变量
不加
volatile
而被优化的问题
在一个项目中,首先在一个 A文件中定义了一些全局
变量
,并赋初值,并在 B文件里引用,并重新在一个函数中重新赋值。在main函数的起始处中调用该赋值函数,发现并没有被重新赋值。 一般情况下,在中断中使用的全局
变量
必须要
volatile
修饰,或者一些 IO 口
变量
必须要
volatile
修饰,但此次发现,即使非中断的情况下,全局
变量
最好也要用
volatile
修饰,不然就会出现预想不到的错误,这类错误还很难调试,很难排查。 ...
Java DCL 单例模式真的需要对
变量
加
Volatile
吗?
原文链接:https://zhuanlan.zhihu.com/p/385271959 目录代码展示DCL分析DCL单例
变量
加
volatile
关键字的原因Java对象创建过程
volatile
修饰单例
变量
的原因不同角度下的对象创建原理从C++角度分析对象创建从Java角度分析对象创建小结CPU模型与DCL完整的Java DCL实例 代码展示 对于单例模式来说,我们为了保证一个类的实例在运行时只有一个,所以我们首先将构造器私有化,禁止在其他地方创建该类的对象,同时我们将单例对象保存在该类的静态
变量
中,当我们需要
volatile
为什么要修饰中断里的
变量
共有四种情况: 就下面这三种情况,还有利用for循环去延时的程序防止被优化(编译器认为for循环没用而优化掉),没有其它了,如果是这几种,那就干脆直接用
volatile
修饰: 一个是防止
变量
在其它地方被改变,而cash里没有改变,所以要求每次都要读取内存。 一个是防止编译器优化,编译器感觉你这个
变量
不会有变化,但是实际在其它线程或硬件会改变它,所以要每次从内存读,你编译器就不要优化。 所以...
C语言
70,021
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章