關鍵字volatile有什麼含義?並給出不同的例子

2021-12-28 07:37:01 字數 1206 閱讀 8148

1樓:

一個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。下面是volatile變數的幾個例子:

1). 並行裝置的硬體暫存器(如:狀態暫存器)

2). 一箇中斷服務子程式中會訪問到的非自動變數(non-automatic variables)

3). 多執行緒應用中被幾個任務共享的變數

回答不出這個問題的人是不會被僱傭的。我認為這是區分c程式設計師和嵌入式系統程式設計師的最基本的問題。嵌入式系統程式設計師經常同硬體、中斷、rtos等等打交道,所用這些都要求volatile變數。

不懂得volatile內容將會帶來災難。

假設被面試者正確地回答了這是問題(嗯,懷疑這否會是這樣),我將稍微深究一下,看一下這傢伙是不是直正懂得volatile完全的重要性。

1). 一個引數既可以是const還可以是volatile嗎?解釋為什麼。

2). 一個指標可以是volatile 嗎?解釋為什麼。

3). 下面的函式有什麼錯誤:

int square(volatile int *ptr)

下面是答案:

1). 是的。一個例子是隻讀的狀態暫存器。它是volatile因為它可能被意想不到地改變。它是const因為程式不應該試圖去修改它。

2). 是的。儘管這並不很常見。一個例子是當一箇中服務子程式修該一個指向一個buffer的指標時。

3). 這段**的有個惡作劇。這段**的目的是用來返指標*ptr指向值的平方,但是,由於*ptr指向一個volatile型引數,編譯器將產生類似下面的**:

int square(volatile int *ptr)

由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段**可能返不是你所期望的平方值!正確的**如下:

long square(volatile int *ptr)

2樓:吃飯自殺的豬

volatile 是說這變數可能會被意想不到地改變通俗的解釋下(不知道確切不):

你要喝豆漿,豆漿通常是做好放在杯子裡,通常情況下你只要端起杯子喝就可以達到目的,

但是,有一天杯子裡放的是奶茶,你拿起杯子就不可能喝道豆漿也就是說,你要喝豆漿,就要去找豆漿,而不能看杯子volatile 的意思可以理解成 從原始地址取值

請輸入關鍵字

醫院用的氧氣瓶 是 固定資產!什麼是固定資產?屬於產品生產過程中用來改變或者影響勞動物件的勞動資料,是固定資本的實物形態。固定資產在生產過程中可以長期發揮作用,長期保持原有的實物形態,但其價值則隨著企業生產經營活動而逐漸地轉移到產品成本中去,並構成產品價值的一個組成部分。根據重要原則,一個企業把勞動...

javasuperthis關鍵字只能在構造方法中使用嗎並

您好,提問者 bai super 是呼叫 du父類的構造方法,只能zhi在子類構造方法的第一行。daothis表示當前物件,可版以在自類中任何地權方使用。class person public void add public class xiaoming extends this只能在同一個類中不同...

C Dictionary異常 給定關鍵字不在字典中

3全部c dictionary異常 給定關鍵字不在字典中是設定錯誤造成的,解決方法為 1 首先可以通過 鍵 來找到訪問字典所需要的值,類似於列表和元組的訪問方式。2 如果 鍵 在字典裡不存在,則就會出現報錯。3 所以就需要判斷 鍵 是否存在。4 也可以使用get 方法獲取指定鍵的值。注意事項 c 是...