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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

C语言volatile关键字—最易变的关键字

發(fā)布時間:2023/12/13 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言volatile关键字—最易变的关键字 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
volatile 是易變的、不穩(wěn)定的意思。很多人根本就沒見過這個關(guān)鍵字,不知道它的存在。也有很多程序員知道它的存在,但從來沒用過它。我對它有種“楊家有女初長成,養(yǎng)在深閨人未識” 的感覺。

volatile 關(guān)鍵字和const 一樣是一種類型修飾符,用它修飾的變量表示可以被某些編譯器未知的因素更改,比如操作系統(tǒng)、硬件或者其它線程等。遇到這個關(guān)鍵字聲明的變量,編譯器對訪問該變量的代碼就不再進行優(yōu)化,從而可以提供對特殊地址的穩(wěn)定訪問。

先看看下面的例子:
? ?int i=10;
? ?int j = i;//(1)語句
? ?int k = i;//(2)語句
這時候編譯器對代碼進行優(yōu)化,因為在(1)、(2)兩條語句中,i 沒有被用作左值。這時候編譯器認為i 的值沒有發(fā)生改變,所以在(1)語句時從內(nèi)存中取出i 的值賦給j 之后,這個值并沒有被丟掉,而是在(2)語句時繼續(xù)用這個值給k 賦值。編譯器不會生成出匯編代碼重新從內(nèi)存里取i 的值,這樣提高了效率。但要注意:(1)、(2)語句之間i 沒有被用作左值才行。

再看另一個例子:
? ?volatile int i=10;
? ?int j = i;//(3)語句
? ?int k = i;//(4)語句
volatile 關(guān)鍵字告訴編譯器i 是隨時可能發(fā)生變化的,每次使用它的時候必須從內(nèi)存中取出i的值,因而編譯器生成的匯編代碼會重新從i 的地址處讀取數(shù)據(jù)放在k 中。

這樣看來,如果i 是一個寄存器變量或者表示一個端口數(shù)據(jù)或者是多個線程的共享數(shù)據(jù),就容易出錯,所以說volatile 可以保證對特殊地址的穩(wěn)定訪問。

但是注意:在VC++6.0 中,一般Debug 模式?jīng)]有進行代碼優(yōu)化,所以這個關(guān)鍵字的作用有可能看不出來。你可以同時生成Debug 版和Release 版的程序做個測試。

留一個問題:const volatile int i=10;這行代碼有沒有問題?如果沒有,那i 到底是什么屬性?

總結(jié)

以上是生活随笔為你收集整理的C语言volatile关键字—最易变的关键字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。