杂记 C中的volatile
volatile
就象大家更熟悉的const一樣,volatile是一個(gè)類型修飾符(type specifier)。它是被設(shè)計(jì)用來修飾被不同線程訪問和修改的變量。如果沒有volatile,基本上會(huì)導(dǎo)致這樣的結(jié)果:要么無法編寫多線程程序,要么編譯器失去大量優(yōu)化的機(jī)會(huì)。(摘自 百度百科)
?
volatile 影響編譯器編譯的結(jié)果,volatile 變量是隨時(shí)可能發(fā)生變化的,與volatile變量有關(guān)的運(yùn)算,不要進(jìn)行編譯優(yōu)化,以免出錯(cuò)。
告訴compiler不能做任何優(yōu)化
表示用volatile定義的變量會(huì)在程序外被改變,每次都必須從內(nèi)存中讀取,而不能把他放在cache或寄存器中重復(fù)使用。
?
筆試常見問題
1)一個(gè)參數(shù)既可以是const還可以是volatile嗎?解釋為什么。?
2); 一個(gè)指針可以是volatile 嗎?解釋為什么。?
3); 下面的函數(shù)有什么錯(cuò)誤:?
int square(volatile int *ptr)?
{?
return *ptr * *ptr;?
}
1)是的。一個(gè)例子是只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖?#xff0c;所以在使用時(shí)候需要從內(nèi)存中直接讀取,而它是const是因?yàn)槌绦虿粦?yīng)該試圖去修改它。(完全是兩個(gè)概念,一個(gè)是讀取并不改變,改變是由于程序有可能對它造成改變,而const是為了不允許程序去改變它。)?
2); 是的。盡管這并不很常見。一個(gè)例子是當(dāng)一個(gè)中斷服務(wù)子程序修該一個(gè)指向一個(gè)buffer的指針時(shí)。?
3) 這段代碼有點(diǎn)變態(tài)。這段代碼的目的是用來返指針*ptr指向值的平方,但是,由于*ptr指向一個(gè)volatile型參數(shù),編譯器將產(chǎn)生類似下面的代碼:?
int square(volatile int *ptr)?
{?
int a,b;?
a = *ptr;?
b = *ptr;?
return a * b;?
}?
由于*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結(jié)果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:?
long square(volatile int *ptr)?
{?
int a;?
a = *ptr;?
return a * a;?
}
參考
http://www.cnblogs.com/chio/archive/2007/11/24/970632.html
本文?由?cococo點(diǎn)點(diǎn)?創(chuàng)作,采用?知識(shí)共享 署名-非商業(yè)性使用-相同方式共享 3.0 中國大陸 許可協(xié)議進(jìn)行許可。歡迎轉(zhuǎn)載,請注明出處:
轉(zhuǎn)載自:cococo點(diǎn)點(diǎn)?http://www.cnblogs.com/coder2012
總結(jié)
以上是生活随笔為你收集整理的杂记 C中的volatile的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【SSH三框架】Hibernate基金会
- 下一篇: 国家哀悼日将网站全部变成灰色的代码