(1)volatile的字面意思:可變的。c語言中volatile用來修飾乙個變數,表示這個變數可以被編譯器之外的東西改變。編譯器之內的意思是變數的值的改變是**的作用,編譯器之外的改變就是這個改變不是**造成的,或者不是當前**造成的,編譯器在編譯當前**時無法預知。譬如在中斷處理程式isr中改變了這個變數的,譬如多執行緒中在別的執行緒中更改了這個變數的值,譬如硬體自動更改了這個變數的值(一般這個變數是乙個暫存器的值)
(2)以上說的三種情況(中斷isr中引用的變數,多執行緒中公用的變數,硬體會更改的變數)都是編譯器在編譯時無法預知的更改,此時應該使用volatile告訴編譯器這個變數屬於這種(可變的)情況。編譯器在遇到volatile修飾的變數時就不會對該變數的訪問進行優化,就不會出現錯誤。
int a, b, c;
a = 3;
b = a;
c = b;
//無優化情況下:記憶體要讀取3次,寫3次
//編譯器優化為:記憶體只要讀1次,寫3次
(3)編譯器的優化在一般情況下非常好,可以幫助提公升程式效率。但是在特殊情況下(volatile)下,變數會被編譯器想象之外的力量所改變,此時如果編譯器沒有意識到而去優化則就會造成優化錯誤,優化錯誤就會帶來執行時錯誤。而且這種錯誤很難被發現。
(4)volatile是程式設計師意識到需要volatile然後在定義變數時加上了volatile,如果你遇到了應該加volatile的情況而沒有加程式可能會被錯誤的優化。如果在不應該加volatile而加了的情況程式不會出錯,只是會降低效率。所以我們對於volatile的態度應該是:正確區分,該加的時候加不該加的時候不加,如果不能確定該不該加為了保險起見就加上。
儲存型別關鍵字
變數的儲存型別是指儲存變數值得儲存器型別。c語言中變數可以存放在3個地方 普通記憶體 執行時的堆疊 堆疊也是記憶體,只是用來暫存資料內容變化非常頻繁 cpu內部的通用暫存器 注意 程式設計師不能修改全域性變數的儲存型別,它只能是靜態的。1.auto關鍵字 基本不用 2.register關鍵字 現在編...
c語言 關鍵字(13)
關鍵字包括register,static,const,typedef,extern 含義 是暫存器變數 作用 請求編譯器盡可能的將這個變數值儲存在cpu內部的暫存器內,以節省cpu從記憶體中抓取資料的時間,提高 的執行效率 適用變數 頻繁被訪問的變數,如迴圈變數 注意事項 1 只能修飾區域性變數,而...
this關鍵字筆記
1.問題提出 需求 在實際程式設計中,我們可能有這樣的需求,當我們建立乙個物件後,就希望該物件自動的擁有某些屬性 例如,我們建立了乙個person物件,就希望該物件自動擁有name和age屬性 function person var p1 new person window.alert p1.nam...