首页 > C/C++ > volatile关键字

volatile关键字

2012年3月18日 发表评论 阅读评论
文章作者:Yx.Ac   文章来源:勇幸|Thinking (http://www.ahathinking.com)   转载请注明,谢谢合作。

---

The C Programming Language》中提到volatile关键字,没怎么看明白,就查了一点资料,另外,实验室的“万古萌物”童鞋给我提供了一个小例子,如下两张图片很好地说明了volatile关键字的用途。

volatile关键字在嵌入式中用的比较多,同const一样都是类型限定符。

volatile关键字在当一个变量有可能意外地发生变化(如多线程应用中被几个任务共享的变量)的情况下使用。volatile意在阻止编译器对该变量进行优化,防止因其意外改变而发生错误。即,在用到这个变量时,都会从新从该变量的原始地址读取变量值,而不是直接读取保存在寄存器中的值

    

下面是几个小问题:

1). 一个参数既可以是const还可以是volatile吗?解释为什么。
2). 一个指针可以是volatile 吗?解释为什么。
3). 下面的函数有什么错误:
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
下面是答案:
1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
2). 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
3). 这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}

volatile应该解释为“直接存取原始内存地址”比较合适,“易变的”这种解释简直有点误导人;
“易变”是因为外在因素引起的,象多线程,中断等,并不是因为用volatile修饰了的变量就是“易变”了,假如没有外因,即使用volatile定义,它也不会变化;

(全文完)

参考文献:

http://blog.21ic.com/user1/2949/archives/2007/35599.html

分类: C/C++ 标签: ,
  • http://mazheng.org 冰上游鱼

    没有用到过volatile,自己写的多线程程序同步了ok了,也没用到。但是公司的人说多线程程序经常用。

    • Yx.Ac

      嗯,貌似真的是经常用到,面试还真有问的,呵呵