QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2558|回复: 6

有谁知道这个volatile的作用

[复制链接]
发表于 2006-4-24 08:12:57 | 显示全部楼层 |阅读模式
昨天看了一个驱动的代码,里面有一行:volatile void delay() {....},觉得十分不解,既然已经是void了,为什么还要volatile?而且还编译通过了
发表于 2006-4-26 15:51:28 | 显示全部楼层
google搜
回复

使用道具 举报

发表于 2006-5-1 20:24:12 | 显示全部楼层
volatile,顾名思义是可变的,不定的意思,随时都可能被改动的值,比如寄存器变量的
回复

使用道具 举报

发表于 2006-5-5 10:38:53 | 显示全部楼层
[quote:fb71debcec="zeero"]volatile,顾名思义是可变的,不定的意思,随时都可能被改动的值,比如寄存器变量的[/quote]
照你的意思,会不会只是用来控制编译时的警告信息?
回复

使用道具 举报

发表于 2006-5-12 10:35:42 | 显示全部楼层
当一个对象的值可能会在编译器的控制或检测之外被改变时,例如一个被系统时钟更新的变量,那么对象应该声明成volatile。编译器执行的某些例行优化行为不能应用在已指定为volatile的对象上。
volatile限定符的用法同const非常相似,都是作为类型的附加修饰符。volatile修饰符的主要目的是提示编译器,该对象的值可能在编译器未监测到的情况下被改变。因此编译器不能武断的对引用这些对象的代码作优化处理。
网上找来的,有个书上有详细介绍的找不了。
基本就是在优化的时候不要去动他的地址。
回复

使用道具 举报

发表于 2006-5-14 18:27:40 | 显示全部楼层
我猜的也很接近kan说的,只是看的角度不一样(为自己镀金了)
一般这些都是一些编译开关。
回复

使用道具 举报

发表于 2006-5-15 00:18:19 | 显示全部楼层
volatile禁止编译器对代码进行优化,比如
volatile int port;
port = *(SOME_ADDR)
while (0 != port)
{
     do_something;
}
如果你不用volatile限制,则编译器发现你这个port在循环中没有进行改变,就不必每次都重新取这个值了。
这样做有可能是不对的,例如 SOME_ADDR可能是个 随时变的硬件寄存器,也有可以是多个进行同时访问的变量,它会随时改变的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-23 08:29 , Processed in 0.068779 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表