程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> volatile

volatile

編輯:C#入門知識

volatile總是與優化有關,編譯器有一種技術叫做數據流分析,分析程序中的變量在哪裡賦值、在哪裡使用、在哪裡失效,分析結果可以用於常量合並,常量傳播等優化,進一步可以死代碼消除。但有時這些優化不是程序所需要的,這時可以用volatile關鍵字禁止做這些優化,volatile的字面含義是易變的,它有下面的作用: 
  
  1 不會在兩個操作之間把volatile變量緩存在寄存器中。在多任務、中斷、甚至setjmp環境下,變量可能被其他的程序改變,編譯器 自己無法知道,volatile就是告訴編譯器這種情況。 
  
  2 不做常量合並、常量傳播等優化,所以像下面的代碼: 
  volatile int i = 1; 
  if (i > 0) ... 
  
  if的條件不會當作無條件真。 
  
  3 對volatile變量的讀寫不會被優化掉。如果你對一個變量賦值但後面沒用到,編譯器常常可以省略那個賦值操作,然而對Memory Mapped IO的處理是不能這樣優化的。 
  
  有人說volatile可以保證對內存操作的原子性,這種說法不大准確,其一,x86需要LOCK前綴才能在SMP下保證原子性,其二,RISC根本不能對內存直接運算,要保證原子性得用別的方法,如atomic_inc。 
  
  對於jiffies,它已經聲明為volatile變量,我認為直接用jiffies++就可以了,沒必要用那種復雜的形式,因為那樣也不能保證原子性。 
  
  你可能不知道在Pentium及後續CPU中,下面兩組指令 
  
  inc jiffies 
  ;; 
  mov jiffies, %eax 
  inc %eax 
  mov %eax, jiffies 
  
  作用相同,但一條指令反而不如三條指令快。 
  
  ------------------------------------------------------------------------------------------------------------
  
  一般這個修飾符用來告知編譯器,被修飾的變量是個“易變的”變量(volatile的本意是“易變的”),防止編譯器進行優化。將變量加上volatile修飾,則編譯器保證對此變量的讀寫操作都不會被優化。
  
  1、中斷服務程序中修改的供其它程序檢測的變量需要加volatile;
  
  2、多任務環境下各任務間共享的標志應該加volatile;
  
  3、存儲器映射的硬件寄存器通常也要加volatile說明,因為每次對它的讀寫都可能由不同意義

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved