作者:admin 日期:2011/10/18 22:36 人气:
这个例子有可能出现死循环,也即!flag不成立,(当然有的编译器是成功的)。
在大多数情况下,把变量缓存在寄存器中是一个非常有价值的优化方法,如果不用的话很可惜。C和C++给你提供了显式禁用这种缓存优化的机会。如果你声明变量是使用了volatile修饰符,编译器就不会把这个变量缓存在寄存器里――每次访问都将去存取变量在内存中的实际位置,14 蝚�絲�亙���葵�������嗅�銝����nbsp。
}
Void fun()
我们都知道,volatile是一个类型修饰符(type specifier),魔域私服,使用它定义的变量每次被访问时都要到初始化它的共享内存中提取,一个很好的朋友给我推荐了一个正品耐克店,一种比较常用的共享内存就是所谓的全局变量,我们使用全局变量进行高效率的参数传递,在《如何编写自己的操作系统》中的第一个例子就是全局变量的妙用。但可以看到我们并没有使用volatile。
Extern void fun();
Int main()
}
{
Unsigned char flag=0;
/*************** fun.c ************/
总结:
出现这个问题的原因是调用fun()后虽然修改了flag,但main.C中的flag还是从寄存器(缓冲区)中取值,因此值仍为0。
Volatile的作用是告诉编译器不要对它修饰的变量做任何优化,12×14=168。也可以这么说:在我们需要作为一个标志符的变量前加volatile。
Flag=0;
Extern Unsigned char flag;
新到公司的第三天(第二次会议上),学长就提出了一个比较头疼的程序bug,变态魔域私服,就是volatile的使用。
有些人会觉得很纳闷,到底什么时候加volatile?
{
如果用Extern volatile Unsigned char flag;就不会出现这个问题了。
while (!flag)
{
Printf(“hello ”);
}
/************** main.c *********************/
flag=1;
其实这是和编译器有关的:老版本的编译器基本上不对变量进行优化,也即每次都是直接从主存读取变量。但随着编译器的成熟和优化,编译器开始对变量的存储优化,即首先从存储器取出这个全局变量的映像保存在寄存器中(即复制变量到寄存器),如果编译器断定紧接下来的代码不会改变此变量的值,那么编译器仍是从寄存器取变量的值,因为这样不用读取存储器,效率提高了。但有利就有弊,看下面的一段代码:
fun();
上一篇:不厌倦就让这种感觉陪着他们永远
下一篇:爱情就是玫瑰花――――――上的刺