C 內聯函式

2021-08-11 06:38:07 字數 2076 閱讀 3077

內聯函式的目的在於提高效率。c++在編譯時會將每個內聯函式的呼叫點用函式體展開,如下:

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)

而如下風格的函式 foo 則成為內聯函式:

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出現時,巨集就會歪曲我們的意思...