內聯函數

內聯函數

簡介

內聯函數是C++爲了提高程序運行速度所做的一項改進。
內聯函數與常規函數的區別在於:c++如何把它們組合到程序中。

編譯過程的最終產品是可執行文件,由一組機器語言指令組成。操作系統將這些指令載入到計算機內存中,因此每條指令都有自己特定的內存地址。計算機隨後逐步執行這些指令。遇到循環或者分支語句的時候,就會向前或者向後跳到特定的地址。

常規函數調用
簡單的說——使程序跳到另一個地址(函數的地址),然後在函數結束的時候返回。
詳細描述——執行到函數調用的指令時,程序將在函數調用後立即存儲該指令的內存地址,並將函數複製到堆棧,跳到標記函數起點的內存單元,執行函數代碼(也許還將返回值放到寄存器中),然後跳回到地址被保存的指令處。來回跳躍並記錄跳躍爲止意味着以前使用函數時,需要一定的開銷。

內聯函數
內聯函數的編譯代碼與其他程序代碼“內聯”起來。編譯器將使用相應的函數代碼來替換函數調用。對於內聯代碼,程序無需跳到另一個位置去執行代碼,再跳回來。
優勢:運行速度更快。
缺點:佔用更多的內存。

使用

  • 在函數聲明前加上關鍵詞inline
  • 在函數定義前加上關鍵詞inline
inline double square(double x){
    return x*x;
}

從運行速度來看,如果不加inline,可能要2.+秒,如果加上了inline,只需要不到0.5s即可。

宏與內聯

C語言使用預處理語句#define來提供宏——內聯函數的原是實現。
來看一下宏的用法:

#define SQUARE(X) X*X

a = SQUARE(2);//得到4
b = SQUARE(2+3);//2+3*2+3=11
int k = 2;
c = SQUARE(k++);

#define SQUARE(X) ((X)*(X))
a = SQUARE(8);//得到4
b = SQUARE(2+3);//(2+3)*(2+3)=25
int k = 2;
c = SQUARE(k++);//(k++)*(k++)。將k先遞增1,然後*,然後再遞增。得到6

宏不能按值傳遞。
所以如果用內聯函數來求square(k++),得到的是k*k的結果,然後k才遞增,k=k+1。inline函數是可以按值遞增。

突然發現一個很有趣的事

int k = 2;
cout<<(k++)*k<<" "<<k<<endl;
k = 2;
cout<<(k)*(k++)<<" "<<k<<endl;
k = 2;
cout<<(k++)*(k++)<<" "<<k<<endl;

輸出的結果:
6 3
6 3
6 4
爲什麼最終得到的結果都是6呢,有待思考
最終的結論:跟不同編譯器的優化相關

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