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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C/C++中volatile关键字的作用

發布時間:2025/3/15 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++中volatile关键字的作用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.前言
 編譯器優化介紹:

  由于內存訪問速度遠不及CPU處理速度,為提高機器整體性能,

1)在硬件上:??引入硬件高速緩存Cache,加速對內存的訪問。另外在現代CPU中指令的執行并不一定嚴格按照順序執行,沒有相關性的指令可以亂序執行,以充分利用CPU的指令流水線,提高執行速度。

2)軟件一級的優化:一種是在編寫代碼時由程序員優化,另一種是由編譯器進行優化。編譯器優化常用的方法有:將內存變量緩存到寄存器。

由于訪問寄存器要比訪問內存單元快的多,編譯器在存取變量時,為提高存取速度,編譯器優化有時會先把變量讀取到一個寄存器中;以后再取變量值時就直接從寄存器中取值。但在很多情況下會讀取到臟數據,嚴重影響程序的運行效果。

----------------------------------------------------------------------------------------------------------------------------------------------------------------

二.volatile詳解

1.原理作用:

  Volatile意思是“易變的”,應該解釋為“直接存取原始內存地址”比較合適。?

  “易變”是因為外在因素引起的,像多線程,中斷等;

  C語言書籍這樣定義volatile關鍵字:volatile提醒編譯器它后面所定義的變量隨時都有可能改變,因此編譯后的程序每次需要存儲或讀取這個變量的時候,告訴編譯器對該變量不做優化,都會直接從變量內存地址中讀取數據,從而可以提供對特殊地址的穩定訪問。。如果沒有volatile關鍵字,則編譯器可能優化讀取和存儲,可能暫時使用寄存器中的值,如果這個變量由別的程序更新了的話,將出現不一致的現象。(簡潔的說就是:volatile關鍵詞影響編譯器編譯的結果,用volatile聲明的變量表示該變量隨時可能發生變化,與該變量有關的運算,不要進行編譯優化,以免出錯)

2.一般用處:

  一般說來,volatile用在如下的幾個地方:?
  1)?中斷服務程序中修改的供其它程序檢測的變量,需要加volatile;?

  當變量在觸發某中斷程序中修改,而編譯器判斷主函數里面沒有修改該變量,因此可能只執行一次從內存到某寄存器的讀操作,而后每次只會從該寄存器中讀取變量副本,使得中斷程序的操作被短路。
  2)?多任務環境下各任務間共享的標志,應該加volatile;?

  在本次線程內,?當讀取一個變量時,編譯器優化時有時會先把變量讀取到一個寄存器中;以后,再取變量值時,就直接從寄存器中取值;當內存變量或寄存器變量在因別的線程等而改變了值,該寄存器的值不會相應改變,從而造成應用程序讀取的值和實際的變量值不一致 。
  3)?存儲器映射的硬件寄存器通常也要加volatile說明,因為每次對它的讀寫都可能由不同意義;

  假設要對一個設備進行初始化,此設備的某一個寄存器為0xff800000。for(i=0;i< 10;i++) ?*output = i;前面循環半天都是廢話,對最后的結果毫無影響,因為最終只是將output這個指針賦值為9,省略了對該硬件IO端口反復讀的操作。

3.幾個問題

?  1)一個參數既可以是const還可以是volatile嗎?

  可以的,例如只讀的狀態寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程序不應該試圖去修改它。

  2) 一個指針可以是volatile 嗎?

  可以,當一個中服務子程序修改一個指向buffer的指針時。

4.下面的函數有什么錯誤:

int square(volatile int *ptr) {return *ptr * *ptr; }

該程序的目的是用來返指針*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; }

注意:頻繁地使用volatile很可能會增加代碼尺寸和降低性能,因此要合理的使用volatile。

總結

以上是生活随笔為你收集整理的C/C++中volatile关键字的作用的全部內容,希望文章能夠幫你解決所遇到的問題。

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