c语言编译器 代码优化,C语言 之编译器优化
C語(yǔ)言的編譯器會(huì)對(duì)變量和代碼進(jìn)行一定的優(yōu)化,我們看下面這個(gè)例子。
int a,b,c;
a=1;
b=a;
c=b;
這個(gè)程序正常運(yùn)行的時(shí)候會(huì)這樣子:先把a(bǔ)指向的內(nèi)存空間內(nèi)放入1
再把a(bǔ)指向的內(nèi)存空間里的數(shù)讀出來(lái)放到b指向的內(nèi)存空間,
最后再把b指向的內(nèi)存空間里的數(shù)讀出來(lái)放到c指向的內(nèi)存空間里。
然而編譯器要對(duì)這個(gè)程序進(jìn)行一定的優(yōu)化,編譯的時(shí)候,直接把1放入三個(gè)內(nèi)存空間中。
這樣子在正常運(yùn)行的時(shí)候確實(shí)是好事,但是總會(huì)有一些特殊的情況發(fā)生,比如,一個(gè)中斷程序突然改變了a的值,那么會(huì)發(fā)生這樣的情況:本來(lái)b和c應(yīng)該是a改變以后的值,可是編譯器優(yōu)化以后就變成了a,b,c都是1,這就很讓人郁悶了。
那么解決方法是,我們?cè)诙x變量的前面加個(gè)volatile這個(gè)關(guān)鍵字,比如:
volatile int a ;
這樣子以后編譯器遇到有a參與的運(yùn)算的時(shí)候就不再給你優(yōu)化了,這樣子可以保證你的程序按照你的預(yù)期進(jìn)行,可是如果你大量使用volatile的話(huà),沒(méi)有優(yōu)化,就會(huì)降低程序運(yùn)行的效率。
本來(lái)C語(yǔ)言的運(yùn)行效率就比匯編低了不少,所以說(shuō)volatile在加的時(shí)候要盡量考慮好,因?yàn)楹芏喑绦蜻\(yùn)行的時(shí)候特別注重效率。
第二種優(yōu)化是restrict關(guān)鍵字,這個(gè)關(guān)鍵字只用來(lái)修飾指針才有用,修飾不同變量沒(méi)有任何用處。
當(dāng)你用restrict修飾的指針不會(huì)被別的東西給改變的時(shí)候,為了提高執(zhí)行的效率,就會(huì)在編譯的時(shí)候給你修改。
比如下面這個(gè)函數(shù):
int main(void)
{
int *restrict p1 , *restrict p2 ,a;
*p1=3;
*p2=5;
a=2+(*p2);
return 0 ;
}
這樣子以后,我們做了優(yōu)化,編譯器在編譯的時(shí)候就會(huì)直接把*p2轉(zhuǎn)換成5(因?yàn)楹竺鏇](méi)有指令能夠?qū)⑵湫薷?#xff0c;所以直接用5來(lái)代替了*p2)
優(yōu)化有好處也有壞處,總之要謹(jǐn)慎使用。
總結(jié)
以上是生活随笔為你收集整理的c语言编译器 代码优化,C语言 之编译器优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 多径瑞利信道的一种matlab产生方法
- 下一篇: 华为时间管理培训