C語言 之編譯器優化

  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)

  優化有好處也有壞處,總之要謹慎使用。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章