**:
乙個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設
這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變
量的值(from memory),而不是使用儲存在暫存器裡的備份。
下面是volatile變數的幾個例子:
1) 並行裝置的硬體暫存器(如:狀態暫存器)
2) 乙個中斷服務子程式中會訪問到的非自動變數(non-automatic variables)
3) 多執行緒應用中被幾個任務共享的變數
回答不出這個問題的人是不會被僱傭的。我認為這是區分c程式設計師和嵌入式系統程式設計師的最基本
的問題。搞嵌入式的傢伙們經常同硬體、中斷、rtos等等打交道,所有這些都要求用到volatile變數
。不懂得volatile的內容將會帶來災難。假設被面試者正確地回答了這是問題(嗯,懷疑是否會是這
樣),我將稍微深究一下,看一下這傢伙是不是直正懂得volatile完全的重要性。
1)乙個引數既可以是const還可以是volatile嗎?解釋為什麼。
2); 乙個指標可以是volatile 嗎?解釋為什麼。
3); 下面的函式有什麼錯誤:
int square(volatile int *ptr)
下面是答案:
1)是的。乙個例子是唯讀的狀態暫存器。它是volatile因為它可能被意想不到地改變。它是const
因為程式不應該試圖去修改它。
2); 是的。儘管這並不很常見。乙個例子是當乙個中服務子程式修該乙個指向乙個buffer的指標時。
3) 這段**有點**。這段**的目的是用來返指標*ptr指向值的平方,但是,由於*ptr指向乙個
volatile型引數,編譯器將產生類似下面的**:
int square(volatile int *ptr)
由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段**可能返不是你所期
望的平方值!正確的**如下:
long square(volatile int *ptr)
volatile關鍵詞學習筆記
volatile 翻譯過來是不穩定的。volatile具有可見性,有序性,但是不具有原子性。所以在需要原子操作的時候,volatile就會讀髒資料。被volatile修飾的變數在每一次呼叫的時候都會從記憶體中去讀取到當前暫存器中,如果有執行緒修改了它,也會實時的同步到記憶體中,並通知其它使用該變數的...
C語言中volatile關鍵詞的用法
volatile指出變數是隨時可能變化的 定義為volatile的變數是說這個變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的的值了。精確得講就是優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份 volatile使用的地方 1 中斷服務程式中修...
關鍵詞密度
百科名片 目錄 隱藏 什麼是增加keywords密度的最好方式 關鍵字堆砌 keyword stuffing 的定義 關鍵字堆砌 keyword stuffing 關鍵字堆砌 keyword stuffing 是指在乙個網頁中非常密集地放置關鍵字。一般說來,如果關鍵字的出現過於頻繁,就會蓋過網頁的其...