关于volatile变量

ftkghost 2004-09-02 01:58:45
volatile其英文意思是不稳定的
我在教程上看到
volatile变量告知编译器,程序可能用不可见的方式改变变量,这些方式取决于具体实现。

请问一下各位高手

不可见的方式?那种方式,具体怎么实现。

能不能麻烦各位给小弟举一个例子?谢谢啦....
...全文
823 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ftkghost 2004-09-02
  • 打赏
  • 举报
回复
谢谢啊~~
Squall1009 2004-09-02
  • 打赏
  • 举报
回复
它的值可能随时被更改
sharkhuang 2004-09-02
  • 打赏
  • 举报
回复
不优化,变量不进入寄存器/
北极猩猩 2004-09-02
  • 打赏
  • 举报
回复
volatile的意义主要在于避免便一起进行不恰当的优化。
就象上面几位说过的。
可能是该变量会被一些在程序外的因素修改,例如:作为硬件缓冲区,或者由其他线程进行修改。
Micro_Sheng 2004-09-02
  • 打赏
  • 举报
回复
volatile在英语里是短瞬的意思,专门用在多线程编程里面。例如有一个int变量为x,有两个线程都会读写一般的编译器或者CPU会自以为聪明的把这个变量保存在寄存器什么的地方,然后读到的时候直接读取寄存器里面的内容而不是真实的内存里面的内容,这样会引起很大问题。给这个变量加上一个volatile就是指示程序每次都必须读取内存内容不要进行缓存,这样读取的才是真实的。
beyondtkl 2004-09-02
  • 打赏
  • 举报
回复
同意 geochway(geochway)的解释.

不可见的方式 比如可能被OS调度的时候 可能会被修改
milefo 2004-09-02
  • 打赏
  • 举报
回复
geochway讲的挺清楚了!
其实定义成volatile后,有关这个变量的操作就不会被优化,因为这个值除了当前的进程会操作外,其他外部进程也可能会有动作。因此多次的连续读写在编译过程中也不会被优化。
具体应用,比较典型的就是一些异步进程对memory的访问,特别是中断处理。
songhonda 2004-09-02
  • 打赏
  • 举报
回复
可能理解为指示编译器不对该变量做优化,而安全按照程序的写法运行。
geochway 2004-09-02
  • 打赏
  • 举报
回复
没说完整,在执行a=5*v之后,有可能恰好在此时出现中断,
将v的值改变,这时再执行b=5*v,结果应该是a和b的值不相同,
但如果编译器按上面的规则一优化,则a和b永远会相同,为了
避免出现这种情况,于是将v定义成volatile的.
geochway 2004-09-02
  • 打赏
  • 举报
回复
所谓的不可见,是指编译器不可预见.
具体实现包括中断例程,多线程都可以改变变量的值.
举个例子:
volatile int v;

void func()
{ int a,b;
a=5*v;
b=5*v;
....
}

如果v是个普通的变量,编译器很可能会做这样的优化,
第一次计算出5*v的值后,先赋给a,然后直接又从寄存赋给b,
而不会重新计算5*v.
如果定义成volatile,编译器则不会做任何优化,每次都会
重新读取v的值.
ftkghost 2004-09-02
  • 打赏
  • 举报
回复
自己re一下
comebaby 2004-09-02
  • 打赏
  • 举报
回复
关注中~~~

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧