解讀關鍵字volatile C語言面試題分析之一 - 程序員學院

文章推薦指數: 80 %
投票人數:10人

解讀關鍵字volatile C語言面試題分析之一,volatile關鍵字是一種型別修飾符,用它宣告的型別變數表示可以被某些編譯器未知的因素更改,比如作業系統硬 ... 解讀關鍵字volatileC語言面試題分析之一 2021-06-2003:24:28字數1353閱讀9188 volatile關鍵字是一種型別修飾符,用它宣告的型別變數表示可以被某些編譯器未知的因素更改,比如:作業系統、硬體或者其它執行緒等。

遇到這個關鍵字宣告的變數,編譯器對訪問該變數的**就不再進行優化,從而可以提供對特殊地址的穩定訪問。

inti=5; inta=i; intb=i; 編譯器發現兩次從i讀資料的**之間,並沒有對i進行過操作,它會自動把上次讀的資料放在b中,而不是重新從i裡面讀; 1.多執行緒應用中被幾個任務共享的變數; 2.一箇中斷服務子程式中會訪問到的非自動變數; 3.並行裝置的硬體暫存器(如:狀態暫存器); 嵌入式系統程式設計師經常同硬體、中斷、rtos等等打交道,所用會經常要求定義為volatile型別的變數。

volatileintncount; 當要求使用volatile宣告的變數的值的時候,系統總是重新從它所在的記憶體讀取資料,即使它前面的指令剛剛從該處讀取過資料。

而且讀取的資料立刻被儲存。

1).一個引數既可以是const還可以是volatile嗎?解釋為什麼。

2).一個指標可以是volatile嗎?解釋為什麼。

3).下面的函式有什麼錯誤: intsquare(volatileint*ptr) 下面是答案: 1).可以是。

例如對於只讀的狀態暫存器而言,如果它僅僅是volatile型別,那麼它還是可能被意想不到的改變。

但它還是const的時候,程式就不應該試圖去修改它 2).可以是的。

儘管這種情況並不常見,但它還是可以。

一個例子就是: 當一箇中斷服務子程式企圖去修改一個指向一個buffer指標的時候。

3).這段**可能有點惡作劇的味道。

但它很好說明volatile型別引數的含義和作用。

這段**的目的是用來返指標*ptr所指向的值的平方, 但是,由於*ptr指向一個volatile型引數,編譯器將產生類似下面的**: intsquare(volatileint*ptr) 由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。

結果,這段**可能返不 是你所期望的平方值!正確的**如下: longsquare(volatileint*ptr) 1.使用volatile關鍵字修飾的變數,可以避免編譯器優化; 2.使用volatile關鍵字修飾的變數,每次都是重新讀取記憶體中的值,而不是使用儲存在暫存器裡的值了; 3.編譯器優化的做法是: inti=5; inta=i; intb=i; 編譯器發現兩次從i讀資料的**之間,並沒有對i進行過操作,它會自動把上次讀的資料放在b中,而不是重新從i裡面讀。

相關推薦 簡單思維題poj1852Ants C理解泛型 procdevicesawk 解讀關鍵字volatileC語言面試題分析之一 Ambari安裝 相關推薦 簡單思維題poj1852Ants C理解泛型 procdevicesawk 解讀關鍵字volatileC語言面試題分析之一 Ambari安裝 相關閱讀 簡單思維題poj1852Ants C理解泛型 procdevicesawk 解讀關鍵字volatileC語言面試題分析之一 Ambari安裝 在什麼情況下應當宣告虛擬函式 topic 科技 教育 python 社會 linux 數碼 java c++ 遊戲 演算法 健康 資料庫 文化 mysql 汽車 娛樂 科學 財經 資料結構 C語言 職場 php oracle C 作業系統 c# 工作 體育 網路 sql



請為這篇文章評分?