一.前言
編譯器優化介紹:html
因爲內存訪問速度遠不及CPU處理速度,爲提升機器總體性能,程序員
1)在硬件上: 引入硬件高速緩存Cache,加速對內存的訪問。另外在現代CPU中指令的執行並不必定嚴格按照順序執行,沒有相關性的指令能夠亂序執行,以充分利用CPU的指令流水線,提升執行速度。緩存
2)軟件一級的優化:一種是在編寫代碼時由程序員優化,另外一種是由編譯器進行優化。編譯器優化經常使用的方法有:將內存變量緩存到寄存器。多線程
因爲訪問寄存器要比訪問內存單元快的多,編譯器在存取變量時,爲提升存取速度,編譯器優化有時會先把變量讀取到一個寄存器中;之後再取變量值時就直接從寄存器中取值。但在不少狀況下會讀取到髒數據,嚴重影響程序的運行效果。函數
----------------------------------------------------------------------------------------------------------------------------------------------------------------性能
二.volatile詳解優化
1.原理做用:spa
Volatile意思是「易變的」,應該解釋爲「直接存取原始內存地址」比較合適。 .net
「易變」是由於外在因素引發的,像多線程,中斷等;線程
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。
-------------------------------------------------------------------------------------------------------------------------------------
引用:https://blog.csdn.net/tigerjibo/article/details/7427366
https://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764231.html