C語言的編譯器會對變量和代碼進行一定的優化,我們看下面這個例子。
int a,b,c;
a=1;
b=a;
c=b;
這個程序正常運行的時候會這樣子:先把a指向的內存空間內放入1
再把a指向的內存空間裏的數讀出來放到b指向的內存空間,
最後再把b指向的內存空間裏的數讀出來放到c指向的內存空間裏。
然而編譯器要對這個程序進行一定的優化,編譯的時候,直接把1放入三個內存空間中。
這樣子在正常運行的時候確實是好事,但是總會有一些特殊的情況發生,比如,一箇中斷程序突然改變了a的值,那麼會發生這樣的情況:本來b和c應該是a改變以後的值,可是編譯器優化以後就變成了a,b,c都是1,這就很讓人鬱悶了。
那麼解決方法是,我們在定義變量的前面加個volatile這個關鍵字,比如:
volatile int a ;
這樣子以後編譯器遇到有a參與的運算的時候就不再給你優化了,這樣子可以保證你的程序按照你的預期進行,可是如果你大量使用volatile的話,沒有優化,就會降低程序運行的效率。
本來C語言的運行效率就比彙編低了不少,所以說volatile在加的時候要儘量考慮好,因爲很多程序運行的時候特別注重效率。
第二種優化是restrict關鍵字,這個關鍵字只用來修飾指針纔有用,修飾不同變量沒有任何用處。
當你用restrict修飾的指針不會被別的東西給改變的時候,爲了提高執行的效率,就會在編譯的時候給你修改。
比如下面這個函數:
int main(void)
{
int *restrict p1 , *restrict p2 ,a;
*p1=3;
*p2=5;
a=2+(*p2);
return 0 ;
}
這樣子以後,我們做了優化,編譯器在編譯的時候就會直接把*p2轉換成5(因爲後面沒有指令能夠將其修改,所以直接用5來代替了*p2)
優化有好處也有壞處,總之要謹慎使用。