關鍵字volatile和register

2021-07-22 21:18:24 字數 744 閱讀 8177

用關鍵字volatile宣告變數,是用來告訴編譯器每次對此變數的引用都需要從記憶體位址中讀取,即取消編譯器對此變數的優化編譯。

當某次引用沒用volatile宣告的變數時,其被編譯器從記憶體位址中讀取到ax(某通用暫存器)中,那麼在其後的引用中,如果ax暫存器沒用被改變,那麼編譯器會優化成直接讀取ax暫存器。用乙個例子來說明:

volatile  int  i = 4;

int j = i;

int k = i;

在上述**中,volatile告訴編譯器i是隨時可能發生改變的,每次使用它必須從i的位址中讀取,因而編譯器生成的可執行**會重新從i的位址讀取資料放到k中。

而優化的做法是由於編譯器發現兩次從i讀取資料的**沒有對i進行操作,它會自動把上次讀的資料放在k中,而不是從新從i中讀取。這樣一來,如果i是乙個暫存器變數或者表示乙個埠資料就容易出錯,而我們加上volatile後就可保證每次都從i的位址中讀取資料。因此volatile可以保證對特殊位址的穩定訪問而不會出錯。

當對乙個變數頻繁讀寫時,需要反覆訪問記憶體,從而花費大量的訪問時間。為此,c語言提供了一種暫存器變數。這種變數存放在cpu的暫存器中,使用時,不需要訪問記憶體,而直接從暫存器中讀寫,從而提高了效率。對於迴圈次數較多的迴圈控制變數及迴圈體內反覆使用的變數,均可以定義為暫存器變數。給出乙個例子:

int func(int n)

return s;

}另外,只要用了register修飾符,對該變數的取位址操作是禁止的,不管事實上該變數是否被放入了暫存器內。

關鍵字 mutable和volatile

1 mutable 在c 中,mutable是為了突破const的限制而設定的。被mutable修飾的變數,將永遠處於可變的狀態,即使在乙個const函式中,甚至結構體變數或者類物件為const,其mutable成員也可以被修改。1.structst 2.3.10.11.constst st 12....

關鍵字volatile和restrict

一 什麼是volatile?什麼是編譯器優化 volatile是乙個型別修飾符,它的主要作用是防止編譯器進行優化。那麼什麼是編譯器優化呢,我們看兩個個例子 例1 x 0x04 x 0x06 x 0x08 對於硬體來說這是3條指令,依次執行,但是如果讓編譯器進行編譯,則它會忽略前面兩條語句,直接得到 ...

關鍵字 volatile關鍵字的作用

1.volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性 使用volatile指每次從記憶體中讀取資料,而不是從編譯器優化後的快取中讀取資料,簡單來講就是防止編譯器優化。2.在單任務環境中,如果在兩次讀取變數之間不改變變數的值,編譯器就會發生優化,會將ram中的值賦值...