C 關鍵字之volatile

2021-08-20 07:35:30 字數 1377 閱讀 7339

在上個文章裡提到了volatile關鍵字,這裡進行一下總結。裡面有網上查到的,也有我使用stm32微控制器時關於volatile的心得。

volatile總是和優化有關,編譯器有一種技術叫資料流分析,分析程式中變數在**賦值,在**使用。但這時有些優化並不為程式需要,這時可以用volatile禁止做這些優化。volatile的字面含義是易變的。

它有以下作用:

1、不會在兩個操作之間把

volatile

變數快取到暫存器中。在多工、中斷、jmp下,變數可能被其他程式改變,編譯器無法自己知道,volatile就是告訴編譯器這種情況。

2、不做常量合併等優化。比如:

volatile int i =1; 

if (i > 0) ... 

if的條件不會當作無條件真。 如果i前面沒有volatile的話,那if的條件就會被不加判斷就認為是真值;現在有了volatile,軟體會從記憶體中讀出i的值,然後再來比較判斷。

3、對volatile

變數的讀寫不會被優化掉。如果你對乙個變數賦值但後面沒有用到,那編譯器常常省略這個操作。

應用舉例1:

我用的vs2010,在debug模式下。兩段**輸出都是一樣的,都是列印10,32。因為debug模式沒有對**進行優化。所以volatile關鍵字的作用看不出來。

在release模式下,編譯器對**進行了優化(左邊的**中_asm裡面的就被優化掉了)。

這樣左邊的**輸出是10,10;而右邊的**輸出是10,32。

這樣就會造成第一條指令丟失,如果用了volatile,就不會被允許優化。

volatile的應用場景:

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

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

3、儲存器對映的硬體暫存器通常也要用volatile說明,因為每次對它的讀寫都可能有不同的含義。(這就是stm32的sram與外設之間的對映)。

volatile與stm32:

大多數c

編譯器不支援位段操作。如在使用不同的位址時,

c編譯器不會認為訪問的是同一儲存器區域,而且他們也不知道對位段別名的訪問只會操作該儲存位置的最低位。

在使用位段特性時,變數需被宣告為

volatile。c

編譯器不知道同乙個資料可以在不同的位址中訪問。因此

volatile

屬性可以確保每次在操作乙個變數時,訪問的是儲存器位置而不是處理器內部的本地資料複製。

C語言關鍵字之volatile

volatile 總是與優化有關,編譯器有一種技術叫做資料流分析,分析程式中的變數在 賦值 在 使用 在 失效,分析結果可以用於常量合併,常量傳播等優化,進一步可以消除一些 但有時這些優化不是程式所需要的,這時可以用 volatile 關鍵字禁止做這些優化。int flag 0 int main v...

Thread之volatile關鍵字

場景二 通過執行緒呼叫 場景三 通過執行緒呼叫,用volatile修飾 總結使變數在多個執行緒間可見。通俗來說就是,當執行緒a對乙個被volatile關鍵字修飾的變數進行修改,該變數對於其它執行緒是可見的,即執行緒每次獲取該變數的值都是最新的。測試volatile關鍵字 author layman ...

C語言volatile關鍵字

volatile 是易變的 不穩定的意思。很多人根本就沒見過這個關鍵字,不知道它的存在。也有很多程式設計師知道它的存在,但從來沒用過它。我對它有種 楊家有女初長成,養在深閨人未識 的感覺。volatile 關鍵字和const 一樣是一種型別修飾符,用它修飾的變數表示可以被某些編譯器未知的因素更改,比...