就象大家更熟悉的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,如需轉載請自行聯系原作者