型別限定符volatile

2022-07-18 05:39:10 字數 896 閱讀 9149

目錄

volatile bool flag;

volatile int a;

新增volatile限定符的變數會獲得幾個特性:

因為這個資料是「易變的(volatile)」,所以要時刻關注,不能偷懶

場景:

把記憶體中的變數拷貝到暫存器中進行處理以加快速度;

存在的問題:

是對變數的拷貝進行處理,而變數本體如果發生變化可能也不會察覺

解決:

加上volatile限定符後,每次處理都會直接從記憶體讀取,所以可以感知變數的變化。

但是:

暫存器走了,快取來了,但問題沒那麼嚴重

多核cpu分別有自己的快取,對記憶體的操作會先通過快取,在乙個cpu對volatile變數進行操作後,會告知其他cpu對其快取進行處理以更新該volatile變數的值,這個告知並處理的流程會損失一點實時性。

「聰明的」編譯器在滿足「同輸入便會同輸出」的as-if原則的前提下,會在編譯的過程中對**進行優化,

加上該限定符後,編譯的**不會亂序,但是執行時可能碰到cpu的亂序執行,即

cpu會對沒有明顯依賴關係的**進行亂序執行,但這段**可能在另乙個執行緒裡存在依賴關係,導致原本設計好的邏輯關係不能實現。

此時有兩種解決辦法:

#includeatomicflag;

參考:c/c++ 中 volatile 關鍵字詳解

c/c++中volatile關鍵字介紹

談談c++的volatile關鍵字以及常見的誤解

變數的屬性 型別限定符 volatile

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

linux volatile型別限定符

背景 一直會有意無意的看到有這個volatile,但是做為乙個在linux應用層寫了幾年 的程式設計師,還真的沒有搞懂什麼時候需要這樣用?查了一圈,網上都是各種告訴編譯器不要把該變數放到暫存器,放到暫存器,如果其它地方改了拿不到最新的值,不要優化等等 首先說下,組合語言真的屬於基本不會那種。多執行緒...

ANSIC型別限定符

以const型別關鍵字宣告的物件,其值不能通過賦值來遞增,遞減來修改。以下 const int a 12 限定a的值不能修改 a 12 不可以編譯器會報錯,但是可以初始化變數,因此下面的 沒問題 const int a 12 沒問題該宣告讓a成為唯讀變數。初始化後,就不能改變它的值。可以用const...