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)
優化有好處也有壞處,總之要謹慎使用。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。