打印
[应用相关]

C语言中volatile是什么意思啊

[复制链接]
楼主: huangfeng33
手机看帖
扫描二维码
随时随地手机跟帖
81
天马兰兰| | 2012-7-17 17:32 | 只看该作者 回帖奖励 |倒序浏览
顶,挺实用的。

使用特权

评论回复
82
sunnyzhaosyz| | 2012-7-21 14:12 | 只看该作者
学习了。。

使用特权

评论回复
83
浇花人123| | 2012-7-22 21:15 | 只看该作者
volatile变量主要用在以下几个方面:
(1)并行设备的硬件寄存器(如状态寄存器);
(2)一个中断服务子程序中会访问到的非自动变量;
(3)多线程应用中被几个任务共享的变量。


9楼的到位

使用特权

评论回复
84
xujing19870807| | 2012-7-25 14:48 | 只看该作者
我也不知道

使用特权

评论回复
85
O寥艺O| | 2012-7-30 13:39 | 只看该作者
学习了

使用特权

评论回复
86
xudingguo| | 2012-7-30 13:55 | 只看该作者
很有用,实际用到的时候才会深有体会

使用特权

评论回复
87
schenglong| | 2012-7-31 19:29 | 只看该作者
同求解释

使用特权

评论回复
88
hawksabre| | 2012-8-2 18:23 | 只看该作者
volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。

例如:
volatile int i=10;
int j = i;
...
int k = i;

volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。

而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问,不会出错。

使用特权

评论回复
89
O寥艺O| | 2012-8-3 22:00 | 只看该作者
学习了

使用特权

评论回复
90
将臣归邪| | 2012-8-4 16:27 | 只看该作者
CPU 要访问 数据A,CPU就要寻址找到存数据A的内存取数据,如果CPU要经常用到数据A,那么编译器就会把数据A做一份拷贝放到cache中(寄存器),这样CPU访问数据A的速度就快很多了,而不是每次都要通过寻址去到数据A的内存中取数。

1、CPU -> 内存A(存着数据A)
2、CPU -> 寄存器(有数据A的拷贝)

如果在数据A前面加了volatile ,不过数据A用得多么频繁,都只能是  1、CPU -> 内存A(存着数据A)的方式取数,而不能够是2、CPU -> 寄存器(有数据A的拷贝)。

CPU到寄存器取数远比到内存中取数快,这或许是编译器会优化经常用到变量的原因。

使用特权

评论回复
91
将臣归邪| | 2012-8-4 18:35 | 只看该作者
2# 王紫豪

哇哦,看到你了:)

使用特权

评论回复
92
jjssunjie| | 2012-8-10 15:48 | 只看该作者
速度快垃圾的两块大陆打 啊的交啊空间

使用特权

评论回复
93
fjzzclc| | 2012-8-14 15:44 | 只看该作者
学习了

使用特权

评论回复
94
joyhung| | 2012-8-22 16:56 | 只看该作者
留名

使用特权

评论回复
95
nashouat| | 2012-8-22 20:12 | 只看该作者
volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。

例如:
volatile int i=10;
int j = i;
...
int k = i;

volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。

而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问,不会出错

使用特权

评论回复
96
yy251745080| | 2012-8-29 23:40 | 只看该作者
原来如此。

使用特权

评论回复
97
callhgd| | 2012-8-30 22:15 | 只看该作者
学习,学习。。。。

使用特权

评论回复
98
原野牧歌| | 2012-9-1 15:28 | 只看该作者
学习了,从来没有考虑过这个问题……

使用特权

评论回复
99
xzyandrew| | 2012-9-3 11:24 | 只看该作者
很不错  学习了

使用特权

评论回复
100
秋风式街球| | 2012-9-7 00:56 | 只看该作者
受教了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则