标题:volatile~
只看楼主
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
已结贴  问题点数:20 回复次数:9 
volatile~
九九最近被考~

ANSI C一共只有32个关键字:
auto
case
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
static
sizof
struct
switch
typedef
union
unsigned
volatile
while

补全所有关键字的作用~
大部分九九都能理解,不过就是不懂volatile是什么意思~

谁能讲讲volatile是什么意思~~
搜索更多相关主题的帖子: 关键字 return double register 
2017-02-09 18:30
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:4 
刚好,我做了这一个关键字的笔记。

volatile 告诉编译器该变量除了可被程序改变外,还可以被其他代理改变。典型的,它被用于和其他并行运行的程序共享数据,例如,一个地址中可能保存着当前的时钟时间,不管程序做些什么,该地址的值都会随时间改变。

举例:

a =  12:20(时间)

如果不加volatile,整个值不会被改变的,编译器就一直将这个变量当成12:20,当时如果加了volatile,那么编译器就不会优化这个变量,每一次使用变量a的时候,都是被改变后的值,而不会是你初始化的值。

[此贴子已经被作者于2017-2-9 18:54编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-09 18:52
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:4 
回复 2楼 renkejun1942
能不能再说明白一点,关键字怎么加啊?volatile int a=(unsigned int)time(0)这样吗?没见过
2017-02-09 19:34
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:4 
抄一段:
2017-02-09 19:54
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 3楼 yangfrancis
不是的,我只是举了个例子。

我重新举一个好一点的例子。

int a = 5;
int val1,val2

val1 = a;
val2 = a;

带一个变量使用的时候,会将a临时存储在一个寄存器中,在val2需要使用到a的时候,可以通过从寄存器而不是初始的内存位置中读取该值来达到节省时间的目的,这就是缓存。

通常,缓存是一个好的优化方式,但如果在两个语句间其他东西改变了a的话,就不是这样了。如果没有使用volatile关键字,编译器将无从得知这种改变是否可能发生。

如果在生命中没有使用关键字volatile,编译器就可以假定一个值在使用过程中没有被修改,它就可以试着优化代码。

好难说明啊,我自己都不知道自己在说什么了。

[此贴子已经被作者于2017-2-9 20:05编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-09 19:58
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
得分:4 
val1 = a;就能把int val1定义在寄存器中吗?register 不是就可以吗?

我是硬件工程师
2017-02-09 21:48
mondays
Rank: 1
等 级:新手上路
帖 子:7
专家分:4
注 册:2017-1-23
得分:4 
volatile 修饰变量 是告诉编译器每次访问这个变量的时候都要去这个变量的地址上去 取值 ,不做任何优化
2017-02-09 22:12
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:0 
回复 5楼 renkejun1942
~~~还是不太清楚这个的用法,还是谢谢了。
2017-02-10 10:44
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
得分:4 
只要知道专用于多线程变量定义的就行了,当你的代码考虑到多线程后,为协调各线程的运作,你自然会理解到这个关键词的用法。
用此关键词就使编译器失去优化机会,因为该修饰词的变量每次使用时必须从内存中读出来,以确保该变量的值随时是最新的。
2017-02-10 11:05
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
谢谢大家解答,这段时间九九比较忙,我也百度一下资料,但资料比较长而且关于线程方面的我现在只能简单了解一下。
先把没有理解的留着,以后再慢慢消化~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-10 21:46



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-474106-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.251355 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved