volatile

volatile的做用是: 做爲指令 關鍵字,確保本條指令不會因 編譯器的優化而省略,且要求每次直接讀值.
簡單地說就是防止編譯器對代碼進行優化.好比以下程序:
1). 並行設備的硬件寄存器(如:狀態寄存器)
2). 一箇中斷服務子程序中會訪問到的非自動變量(Non-automatic variables)
3). 多線程應用中被幾個任務共享的變量
 
1). 一個參數既能夠是const還能夠是volatile嗎?解釋爲何。
2). 一個指針能夠是volatile 嗎?解釋爲何。
3). 下面的函數被用來計算某個整數的平方,它能實現預期設計目標嗎?若是不能,試回答存在什麼問題:
1
2
3
4
int  square( volatile  int  *ptr)
{
     return  ((*ptr) * (*ptr));
}
下面是答案:
1). 是的。一個例子是隻讀的 狀態寄存器。它是volatile由於它可能被意想不到地改變。它是const由於程序不該該試圖去修改它。
2). 是的。儘管這並不很常見。一個例子是當一箇中斷服務子程序修改一個指向一個buffer的 指針時。
3). 這段代碼是個惡做劇。這段代碼的目的是用來返指針*ptr指向值的平方,可是,因爲*ptr指向一個volatile型參數, 編譯器將產生相似下面的代碼:
1
2
3
4
5
6
7
int  square( volatile  int * &ptr) //這裏參數應該申明爲引用,否則函數體裏只會使用副本,外部無法更改
{
     int  a,b;
     a = *ptr;
     b = *ptr;
     return  a*b;
}
因爲*ptr的值可能在兩次取值語句之間發生改變,所以a和b多是不一樣的。結果,這段代碼可能返回的不是你所指望的平方值!正確的代碼以下:
1
2
3
4
5
6
long  square( volatile  int *ptr)
{
     int  a;
     a = *ptr;
     return  a*a;
}
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息