C語言關鍵字之voliate

2021-08-19 13:55:27 字數 843 閱讀 1689

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...