細談volatile限定符 上海先鋒商泰面試歸來

2021-05-23 11:02:40 字數 1024 閱讀 4119

volatile的本意是「易變的」,由於訪問暫存器的速度要快過ram,所以編譯器一般都會作減少訪問外部ram的優化。比如:

程式的本意是希望isr_2中斷產生時,在main當中呼叫dosomething函式,但是,由於編譯器判斷在main函式裡面沒有修改過i,因此可能只執行一次對從i到某暫存器的讀操作,然後每次if判斷都只使用這個暫存器裡面的「i副本」,導致dosomething永遠也不會被呼叫。如果將變數加上volatile修飾,則編譯器保證對此變數的讀寫操作都不會被優化(肯定執行)。此例中i也應該如此說明。

一般說來,volatile用在如下的幾個地方:

1、中斷服務程式中修改的供其它程式檢測的變數需要加volatile;

2、多工環境下各任務間共享的標誌應該加volatile;

3、儲存器對映的硬體暫存器通常也要加volatile說明,因為每次對它的讀寫都可能由不同意義;

另外,以上這幾種情況經常還要同時考慮資料的完整性(相互關聯的幾個標誌讀了一半被打斷了重寫),在1中可以通過關中斷來實現,2中可以禁止任務排程,3中則只能依靠硬體的良好設計了。

注意:在vc6中,一般除錯模式沒有進行**優化,所以這個關鍵字的作用看不出來。下面通過插入彙編**,測試有無volatile關鍵字,對程式最終**的影響:

首先,用classwizard建乙個win32 console工程,插入乙個voltest.cpp檔案,輸入下面的**:

在除錯版本模式執行程式,輸出結果如下:

i = 10

i = 32

在release版本模式執行程式,輸出結果如下:

i = 10

i = 10

輸出的結果明顯表明,release模式下,編譯器對**進行了優化,第二次沒有輸出正確的i值。下面,我們把 i的宣告加上volatile關鍵字,看看有什麼變化:

分別在除錯版本和release版本執行程式,輸出都是:

i = 10

i = 32

這說明volatile這個關鍵字發揮了它的作用!

型別限定符volatile

目錄volatile bool flag volatile int a 新增volatile限定符的變數會獲得幾個特性 因為這個資料是 易變的 volatile 所以要時刻關注,不能偷懶 場景 把記憶體中的變數拷貝到暫存器中進行處理以加快速度 存在的問題 是對變數的拷貝進行處理,而變數本體如果發生變...

變數的屬性 型別限定符 volatile

volatile可以理解為 編譯器警告指示字 volatile告訴編譯器必須每次去記憶體中取變數值 volatile主要修飾可能被多個執行緒訪問的變數 volatile也可以修飾可能被未知因數更改的變數 如 int obj 0 int a 0 int a 0 a obj sleep 100 b ob...

引用限定符

通常,我們在乙個物件上呼叫成員函式,而不管該物件是乙個左值還是乙個右值。例如 string s1 a value s2 another auto n s1 s2 find a 此例中,我們在乙個string右值上呼叫find成員,該string右值是通過連線兩個 string 而得到的。有時,右值的...