面試驗:解讀關鍵字volatile(C語言面試題分析之一)

來源:互聯網
上載者:User

面試驗:解讀關鍵字volatile

C語言面試題分析之一

一.volatile是什嗎?

volatile關鍵字是一種類型修飾符,用它聲明的類型變數表示可以被某些編譯器未知的因素更改,比如:作業系統、硬體或者其它線程等。遇到這個關鍵字聲明的變數,編譯器對訪問該變數的代碼就不再進行最佳化,從而可以提供對特殊地址的穩定訪問。

二.編譯器最佳化是什麼意思?

int i = 5;

int a = i;

……

int b = i;

編譯器發現兩次從i讀資料的代碼之間,並沒有對i進行過操作,它會自動把上次讀的資料放在b中,而不是重新從i裡面讀;

三.哪些情況,改變了記憶體中變數的值,編譯器不知道?

1.多線程應用中被幾個任務共用的變數;

2.一個中斷服務子程式中會訪問到的非自動變數;

3.平行裝置的硬體寄存器(如:狀態寄存器);

四.何時需要使用volatile這個關鍵字?

嵌入式系統程式員經常同硬體、中斷、RTOS等等打交道,所用會經常要求定義為volatile類型的變數。

五.使用volatile帶來什麼好處?

volatile int nCount;

當要求使用volatile 聲明的變數的值的時候,系統總是重新從它所在的記憶體讀取資料,即使它前面的指令剛剛從該處讀取過資料。而且讀取的資料立刻被儲存。

六.3個經典的volatile問題

1). 一個參數既可以是const還可以是volatile嗎?解釋為什麼。
2). 一個指標可以是volatile 嗎?解釋為什麼。
3). 下面的函數有什麼錯誤:
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
下面是答案:
1). 可以是。例如對於唯讀狀態寄存器而言,如果它僅僅是volatile類型,那麼它還是可能被意想不到的改變。但它還是const的時候,程式就不應該試圖去修改它
2). 可以是的。

儘管這種情況並不常見,但它還是可以。一個例子就是:

當一個中斷服務子程式企圖去修改一個指向一個buffer指標的時候。
3). 這段代碼可能有點惡作劇的味道。但它很好說明volatile型別參數的含義和作用。

這段代碼的目的是用來返指標*ptr所指向的值的平方,

但是,由於*ptr指向一個volatile型參數,編譯器將產生類似下面的代碼:
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段代碼可能返不
是你所期望的平方值!正確的代碼如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}

七.總結

1.使用volatile關鍵字修飾的變數,可以避免編譯器最佳化;

2.使用volatile關鍵字修飾的變數,每次都是重新讀取記憶體中的值,而不是使用儲存在寄存器裡的值了;

3.編譯器最佳化的做法是:

int i = 5;

int a = i;

……

int b = i;

編譯器發現兩次從i讀資料的代碼之間,並沒有對i進行過操作,它會自動把上次讀的資料放在b中,而不是重新從i裡面讀。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.