面試問題之C 語言 volatile關鍵字的作用

2022-09-03 12:15:06 字數 464 閱讀 3806

volatile的作用

volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性;使用volatile指每次從記憶體中讀取資料,而不是從編譯器優化後的快取中讀取資料,簡單來講就是防止編譯器優化。

在單任務環境中,如果在兩次讀取變數之間不改變變數的值,編譯器就會發生優化,會將ram中的值賦值到暫存器中;由於訪問暫存器的效率要高於ram,所以在需要讀取變數時,直接暫存器中獲取變數的值,而不是從ram中。

在多工環境中,雖然在兩次讀取變數之間不改變變數的值,在一些情況下變數的值還是會發生改變,比如在發生中斷程式或者有其他的執行緒。這時候如果編譯器優化,依舊從暫存器中獲取變數的值,修改的值就得不到及時的響應(在ram還未將新的值賦值給暫存器,就已經獲取到暫存器的值)。

要想防止編譯器優化,就需要在宣告變數時加volatile關鍵字,加關鍵字後,就在ram中讀取變數的值,而不是直接在暫存器中取值。

面試問題之C 語言 簡述編譯過程

於 編譯過程主要分為四步 1 詞法分析 掃瞄 執行類似於有限狀態機的演算法將源 的字元分割成一系列的記號。詞法分析產生的記號一般分為幾種 關鍵字 識別符號 字面量 數字,字串等 特殊標記 加號,等號等 另外,掃瞄器也完成其他一些工作,比如將識別符號存放到符號表中,將數字 字串常量存放到文字表中。2 ...

面試問題c

1 如何避免記憶體洩漏 2 namespace 3 如何防止記憶體洩漏 4 堆和棧的區別 5 記憶體的幾種形式 6 linux指令 1 如何避免記憶體洩漏 答 記憶體洩漏 記憶體洩漏是指由於未能釋放掉不再使用的記憶體情況,並不是指內存在物理上的消失,而是應用程式分配某段記憶體後,由於設計錯誤失去了對...

C 面試問題

一面 1 多型性都有哪些?靜態和動態,然後分別敘述了一下虛函式和函式過載 2 動態繫結怎麼實現?就是問了一下基類與派生類指標和引用的轉換問題 3 型別轉換有哪些?四種型別轉換,分別舉例說明 4 操作符過載 操作符 具體如何去定義,讓把操作符過載函式原型說一遍 5 記憶體對齊的原則?原則敘述了一下並舉...