voliate的作用是作為指令關鍵字,確保本條指令不會因為編譯器的優化而省略,而且要求每次從記憶體中直接讀取值
當使用voliate 宣告變數值時,系統總是重新從它所在的記憶體讀取資料,直接訪問變數位址,而編譯器對於訪問該變數時也不再進行優化
voliate關鍵字影響編譯器的結果,用voliate 宣告的變數表示該變數隨時可能發生變化(因為編譯器優化時可能將其放入暫存器中),與該變數有關的運算,不要再進行編譯優化以免出錯。
暫存器常用的優化方法:1.將記憶體變數快取到暫存器中
2.調整指令順序,充分利用cpu指令流水線,進行指令重新排序讀寫指令。
下面來看乙個程式
int main();
for (i = 0; i < 12; i++)
return 0;}
結果會是什麼?出現了陣列越界訪問,程式還對嗎?
但是在vs2013執行的結果卻是死迴圈,為什麼?
而且當我們將偵錯程式換為release時竟然執行出來了12個hehe?!!
首先我們看看為什麼會是迴圈
記憶體的儲存中的儲存是由高到低的
而陣列則是由低到高的
當到arr[12]時arr[12]的位址又與i的位址相同了,i又被初始為零
在vs2013中有兩個預留的間隔,而在vc6中只有乙個預留的間隔所以編譯器不一樣結果也不一樣
其次我們看看編譯器是怎樣優化
編譯器 更改了指令的順序,將i的初始時序放到了陣列下面,避免了迴圈,這個可以在反彙編中檢視
所以說編譯器的優化結果是可能對程式結果產生影響的
C語言總結之 關鍵字
我記得我開始學習c語言的時候,那時候還在讀高中,我們老師就把c語言的關鍵字,全部寫在黑板上,老師說我們下面的兩節課的內容就是 把它給記下來 你還記得標準c有多少個關鍵字嗎?第一 關鍵字描述 c99 關鍵字為32個 如果你還有不認識的,還應該好好複習複習了。關鍵字 意義 auto 宣告自動變數,預設時...
C語言關鍵字之const
const關鍵字是嵌入式程式設計師必須熟悉的。因為它的使用可以增加程式的健壯性,並且使讀者更好地理解程式。它所修飾的變數被叫做 唯讀變數 注意 唯讀變數 常量 千萬不要說被const所修飾的變數就是常量!那只能說明你對const還不太理解!下面就讓我們來分析一下const。首先看以下定義 const...
C語言關鍵字之volatile
volatile 總是與優化有關,編譯器有一種技術叫做資料流分析,分析程式中的變數在 賦值 在 使用 在 失效,分析結果可以用於常量合併,常量傳播等優化,進一步可以消除一些 但有時這些優化不是程式所需要的,這時可以用 volatile 關鍵字禁止做這些優化。int flag 0 int main v...