C 中volidate關鍵字

2021-08-01 18:28:19 字數 1322 閱讀 6695

我們都知道當使用編譯器時候,編譯器會為我們的**做出一些優化。關於validate關鍵字的功能和原理我們將用乙個例子來給出解釋。

功能:當乙個變數被volidate關鍵字修飾時,意味著當我們每次使用這個變數時都會從變數所在的記憶體中去獲取。而不使用編譯器為我們優化後儲存在cpu暫存器中的備份。接下來舉個例子給大家說明下。

例子:假設在某乙個執行緒中有如下的程式**,

...

int a = 9;

int b = a;

int c = a;

...

這裡我們首先給定變數a的值,然後使用a的值初始化b,緊接著在使用a值初始化c。在這裡**執行的時候,編譯器會為我們的程式做出乙個優化:首先執行b = a後,這時從記憶體是將a的值取出來給b。由於本程

序自己沒有對變數修改,這時會把a的值放入到cpu的暫存器中,以後讀取的時候直接使用cpu暫存器中的副本,而不是在次訪問記憶體讀取資料。這樣可以起到優化的作用提高讀取的速度。另外我們要知道,使用者狀態是不允許修改cpu暫存器中的值。

但是這樣做就會產生乙個潛在的隱患,當執行完b = a後,cpu的暫存器中就會有乙個變數a值的副本以便在以後的訪問中使用。但是可能另外乙個執行緒對a的值(程式自己不修改變數,但是程式之外的東西可能會對資料a進行修改)進行改變,然後將改變後的值寫入到記憶體中去。但是當前執行緒不知道這個值發生了改變,不會更新cpu暫存器中的副本(使用者狀態是不允許修改cpu暫存器中的值),執行c = a的時候直接從暫存器中讀取未發生改變的值,但是此時記憶體中的值已經發生了改變,獲取的值不是真正意義上的值。

volidate關鍵字就是為了解決這個問題的,不論何時都從記憶體中讀取資料,不使用編譯器的優化後的值。當然由於volidate是每次訪問都從記憶體中讀取,這必定會造成效率下降的問題。

常見問題:

question1:乙個變數為什麼既可以使用volidate修飾,也可以使用const修飾?

答:這兩個關鍵字從字面意思看像是對立的,volidate說明這個變數是「易變」的,而const說明這個變數是「不變」地。從字面上看這兩個關鍵字相互矛盾的,但是但是究其本質,我們會發現這兩個關鍵字起到了增強效果的作用。volidate關鍵字說被修飾的變數是「易變」的,每次都要從變數所在的記憶體中讀取。因為變數可能可能被本程式(變數所在的程式)之外的東西(如作業系統、其他執行緒等)發生意想不到的修改,這時只要我們每次都從變數記憶體中讀取,就會獲得變數的真實值(如果沒有volidate關鍵,編譯器優化可能會引發災難)。const關鍵字只是說明被修飾的變數不能在本程式內被修改,但是本程式之外還是有可能修改改變量的,比如其他執行緒修改。

C 中struct關鍵字和class關鍵字的區別

剛開始接觸 c 看到 中有struct關鍵字,還以為是用了結構體,結果後來發現 struct 和 class 一樣都用於類的定義,於是把兩者的差別記錄於此。一句話總結 兩者均可用於定義類,唯一的區別是兩者定義的類的預設訪問許可權有差別。其實比兩者差別更重要的是,我很好奇為什麼 c 中會存在兩個用於定...

c 中mutable關鍵字

mutalbe的中文意思是 可變的,易變的 跟constant 既c 中的const 是反義詞。在c 中,mutable也是為了突破const的限制而設定的。被mutable修飾的變數,將永遠處於可變的狀態,即使在乙個const函式中。我們知道,如果類的成員函式不會改變物件的狀態,那麼這個成員函式一...

c中static關鍵字

看別人的c 會看到很多變數或者函式前面帶有static關鍵字。c中的static和php中的static有很到的不同,在php中static表示靜態化變數,乙個類中的static成員只與類有關,而與類的例項無關。c中的static關鍵字主要用於隱藏 access control 1.隱藏 函式前的s...