內聯函式的目的在於提高效率。c++在編譯時會將每個內聯函式的呼叫點用函式體展開,如下:
而如下風格的函式 foo 則成為內聯函式:inline
必須與函式定義體放在一起才能使函式成為內聯,僅將int max(int a, int b)
則呼叫: cout
<<(a > b ? a : b)《從而避免了呼叫函式的額外開銷。
關鍵字inline
inline
放在函式宣告前面不起任何作用。如下風格的函式 foo 不能成為內聯函式:
inline void foo(int x, int y); // inline 僅與函式宣告放在一起
void foo(int x, int y)
void foo(int x, int y);
inline void foo(int x, int y) // inline 與函式定義體放在一起
類的成員函式如果是定義在類的內部,則預設是內聯函式,如果是定義在類的外部則預設不是內聯函式,除非在這個外部定義的函式前用關鍵字inline
修飾
如果內聯函式定義在原始檔中,那麼就只有該原始檔可以呼叫到內聯函式,這是和普通函式不同的地方。所以如果要在多個原始檔中呼叫同乙個的內聯函式,則要求這些原始檔裡都存在該內聯函式的定義而且完全相同才行。正因為如此,內聯函式的宣告和定義一般都放在標頭檔案中,利用編譯器匯入和原始檔中,從而保證各原始檔的內聯函式定義一樣。
我們來看乙個例子:
a.h :
class a
int max();
private:
int a;
int b;
};a.cpp :
#include "a.h"
inline
int a::max()
main.cpp :
#include
#include "a.h"
using
namespace
std;
inline
int a::max()
int main()
一切正常編譯,輸出結果:5
倘若你在main.cpp中沒有定義max內聯函式,那麼會出現鏈結錯誤:
error lnk2001: unresolved external symbol 「public: int __thiscall a::max(void)」 (?max@a@@qaehxz)main.obj
乙個較為合理的經驗準則是, 不要內聯超過 10 行的函式. 謹慎對待析構函式, 析構函式往往比其表面看起來要更長, 因為有隱含的成員和基類析構函式被呼叫!
另乙個實用的經驗準則: 內聯那些包含迴圈或 switch 語句的函式常常是得不償失 (除非在大多數情況下, 這些迴圈或 switch 語句從不被執行).
inline
對編譯器來說只是乙個建議,編譯器完全可以不採納這個建議。有些函式即使宣告為內聯的也不一定會被編譯器內聯。
內聯函式可以避免巨集的邊際效應。
#define square(x) ((x)*(x));
inline
double square(double x)
int c, d;
c = d = 11;
int e = square(c++);
int f = square(d++);
cout
<< "e = "
<< e << ", now c is"
<< c << endl;
cout
<< "f = "
<< f << ", now d is "
<< d << endl;
輸出的結果如下:
e = 132, now c is13
f = 121, now d is 12
內聯函式在debug版中並沒有真正的內聯,所以可以除錯。在release版中才會被編譯器內聯。 C 內聯函式
1 什麼是內聯函式?內聯函式就是小型函式,犧牲空間來節省函式呼叫的開銷,一般用作比較小的函式,即函式內部沒有迴圈 開關語句等。內聯函式被發明出來就是為了取代c中的巨集,因為巨集是單純的替換而沒有型別檢查所以經常出毛病,2 為什麼要引入內聯函式?當然,引入內聯函式的主要目的是 解決程式中函式呼叫的效率...
C 內聯函式
1 什麼是內聯函式?2 為什麼要引入內聯函式?3 為什麼inline能取代巨集?4 內聯函式和巨集的區別?5 什麼時候用內聯函式?6 如何使用內聯函式?7 內聯函式的優缺點?8 如何禁止函式進行內聯?9 注意事項 1 什麼是內聯函式?內聯函式是指那些定義在類體內的成員函式,即該函式的函式體放在類體內...
c 內聯函式
1 什麼是內聯函式?內聯函式是指那些定義在類體內的成員函式,即該函式的函式體放在類體內。2 為什麼要引入內聯函式?當然,引入內聯函式的主要目的是 解決程式中函式呼叫的效率問題。另外,前面我們講到了巨集,裡面有這麼乙個例子 define abs x x 0?x x 當 i出現時,巨集就會歪曲我們的意思...