日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言学习及应用笔记之四:C语言volatile关键字及其使用

發布時間:2024/7/23 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言学习及应用笔记之四:C语言volatile关键字及其使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在C語言中,還有一個并不經常使用但卻非常有用的關鍵字volatile。那么使用volatile關鍵字究竟能干什么呢?接下來我將就此問題進行討論。

一個使用volatile關鍵字定義變量,其實就是告訴編譯系統這變量可能會被意想不到地改變。那么編譯時,編譯器就不會自作主張的去假設這個變量的值,而進行代碼的優化了。確切的說就是,編譯器在編譯代碼時,優化器每次遇到這個變量,都會到內存中重新讀取,而不會使用保存在寄存器里的備份來對代碼進行優化。

我們已經了解了volatile關鍵字的基本作用。那么,在什么情況下使用volatile關鍵字呢?一般說來,在如下的幾種情況通常會使用volatile關鍵字:

  • 在中斷服務程序中修改的,供其它程序檢測的變量,通常需要定義為volatile;

  • 在多任務環境下,各任務間共享的標志,通常也需要定義為volatile;

  • 存儲器映射的硬件寄存器通常也需要定義為volatile,因為每次對它的讀寫都可能有不同意義;

1)使用中斷改變對象值的情況

我們在中斷服務程序中操作了某個對象,比如誰改變了一個變量的值。而在其它程序中我們希望通過這個變量值得改變去進行一些操作。在這個時候,我們使用或者不使用volatile關鍵字,可能得到截然不同的結果。

如果我們將變量定義為:static int var=0;?,然后再中斷服務成勛中將其修改為:var=1,但是在另一函數中使用它但不會修改它,那么編譯器會認為它沒有變化,從而直接使用寄存器中的副本。

如果我們將變量定義為:volatile int var=0;,那么結果就完全不同了,每次在函數中使用var變量時,都會重新讀取,而不會使用寄存器中的副本。

(2)多任務共享標志的情況

多任務共享時,其實也是一樣的,在一個任務中修改了一個對象后,在另一個對象中應用它,但編譯器并沒發現在該任務中對它有修改。由于訪問寄存器的速度要快過RAM,所以編譯器一般都會作減少存取外部RAM的優化。從而并不能響應在另一任務下的變化。

在這種情況下,一般我們都需要使用volatile關鍵字來定義任務間共享的標識。

3)硬件寄存器內存映射的情況

內存映射的情況是非常多的,比如我們將外設的寄存器映射到內存的某一段區域;再比如我們同過DMA方式將數據直接寫到內存中的某一段區域。

由于我們外部的數據都是直接進入了內存區域,而程序知識引用它的值。編譯器優化時可能就直接采用寄存器中的副本了。佷顯然這不是我們需要的結果,這時將這段內存對應的變量聲明為volatile,則可以保證我們的需求。

綜上所述,我們說明了volatile關鍵字的常規用法。當然,我們也可以發現volatile關鍵字是會降低編譯器優化力度的,但它卻可以保證程序的正確性,所以在適合的地方使用volatile關鍵字是必要的。不過能不能用的好,還要看編程者的基本功。

歡迎關注:

總結

以上是生活随笔為你收集整理的C语言学习及应用笔记之四:C语言volatile关键字及其使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。