天天看點

雜記 C中的volatile

就象大家更熟悉的const一樣,volatile是一個類型修飾符(type specifier)。它是被設計用來修飾被不同線程通路和修改的變量。如果沒有volatile,基本上會導緻這樣的結果:要麼無法編寫多線程程式,要麼編譯器失去大量優化的機會。(摘自 百度百科)

  volatile 影響編譯器編譯的結果,volatile 變量是随時可能發生變化的,與volatile變量有關的運算,不要進行編譯優化,以免出錯。

  

告訴compiler不能做任何優化

表示用volatile定義的變量會在程式外被改變,每次都必須從記憶體中讀取,而不能把他放在cache或寄存器中重複使用。

1)一個參數既可以是const還可以是volatile嗎?解釋為什麼。 

2); 一個指針可以是volatile 嗎?解釋為什麼。 

3); 下面的函數有什麼錯誤: 

int square(volatile int *ptr) 

return *ptr * *ptr; 

}

1)是的。一個例子是隻讀的狀态寄存器。它是volatile因為它可能被意想不到地改變,是以在使用時候需要從記憶體中直接讀取,而它是const是因為程式不應該試圖去修改它。(完全是兩個概念,一個是讀取并不改變,改變是由于程式有可能對它造成改變,而const是為了不允許程式去改變它。) 

2); 是的。盡管這并不很常見。一個例子是當一個中斷服務子程式修該一個指向一個buffer的指針時。 

3) 這段代碼有點變态。這段代碼的目的是用來返指針*ptr指向值的平方,但是,由于*ptr指向一個volatile型參數,編譯器将産生類似下面的代碼: 

int a,b; 

a = *ptr; 

b = *ptr; 

return a * b; 

由于*ptr的值可能被意想不到地該變,是以a和b可能是不同的。結果,這段代碼可能返不是你所期望的平方值!正确的代碼如下: 

long square(volatile int *ptr) 

int a; 

return a * a; 

本文轉自cococo點點部落格園部落格,原文連結:http://www.cnblogs.com/coder2012/p/3167665.html,如需轉載請自行聯系原作者

繼續閱讀