无语
勤奋,踏实,在生活中学习,在学习中快乐……

volatile用法:
    在c语言开发中,volatile关键字主要用在编写访问I/O端口或中断服务的程序中。这些程序可能改变某一内存单元或I\O端口的变量,而这些变量在其它程序中被使用。volatile关键字告诉编译器,任何时候都不要对变量的值进行假设,编译器不会为了快速存取而将变量的值存储在寄存器中,因为这样,内存中的值有可能与寄存器中不一致。

  
    程序如下面所示:

int sample(int *flag)
{
    
if(*flag==0)
    
{
       DoSomething();
    }

 
    DoAnotherThing();
    
if(*flag== 0)
    
{
        DoThing();
    }

}

    分析这个程序,假设flag是某个端口状态,程序原来想表达:如果此端口为0状态时,执行DoSomething,DoAnothing,后判断是否仍是0态,若是,则执行DoThing。如果编译器为了提高速度,将此端口状态保存在寄存器中,访问寄存器,则前后两次必然一致,而实际情况是:在第一次读取状态后,此端口状态可能由于外部原因被改变,则此函数的执行结果就是错误的。所以在此应将flag声明为volatile,告诉编译器读取最新值(此程序纯属扯淡,只是为了说明问题)。
    volatile关键字很少使用,但在多线程中,很有可能存在多个线程同享一个对象,对象可能被某一线程改变的情况,在这种情况下,一定要将对象声明为volatile。


Mutable用法:
    mutable限定关键字说明被修饰对象在任何情况下都是可以被改变的。
    假设,我们在写一个屏幕的类,其中有三个私有变量,屏幕的长、宽、当前鼠标的位置。对于屏幕来说,长、宽是其基本属性,而鼠标位置则是应该可以在整个屏幕内移动的,它不属于屏幕本身的状态。在初始化屏幕时,我们将其声明为const,则其私有变量均不能改变,而实际我们想表达的意思是屏幕是不变的,而鼠标则可以在屏幕内移动。这就出现了语法和语义之间的矛盾。mutable关键字就是解决这个问题的,被声明为mutable的私有变量无论在const函数中,或被声明为const的对象中,都可以改变。例如下面程序:
    

#include<iostream>
using namespace std;

class Screen{
private:
    
int _width;
    
int _height;
    mutable 
int _cursor;
public:
    Screen(
int width=100int height=50int cursor = 0)
        :_width(width),_height(height),_cursor(cursor)
    
{

    }

    
void move(int row,int col) const
    
{
        
if (row < _height && row > -1)
        
{
            
if ( col < _width && col > -1)
            
{
                _cursor 
= row * _width + col;
            }

        }

    }

    
int getCursor() const
    
{
        
return _cursor;
    }

}
;

int main()
{
    
const Screen *scr=new Screen();

    cout 
<< scr->getCursor() << endl;

    scr
->move(20,3);
    cout 
<< scr->getCursor() << endl;
    
    scr
->move(49,99);
    cout 
<< scr->getCursor() << endl;
    
return 0;
}

    move函数没有改变Screen状态,所以将其声明为const,运行程序发现,_cursor变量被改变了,这说明无论在const函数中,或const对象中,mutable变量都是可以被改变的。本例来源于c++primer。

posted on 2008-04-30 15:52  程、诚、成  阅读(2157)  评论(0编辑  收藏  举报