C 之內聯函式

2021-07-25 08:03:49 字數 1394 閱讀 6780

一、目的

提高程式執行速度所做的一項改進。

二、內聯函式與常規函式的區別

編譯過程的最終產品是程式——由一組機器語言指令組成。執行程式時作業系統將這些指令載入到計算機記憶體中,因此每條指令都有特有的記憶體位址。計算機隨後逐步執行這些命令。

執行到函式呼叫指令時,程式將在函式呼叫後立即儲存該指令的記憶體位址,並將函式引數複製到堆疊(位次保留的記憶體塊),跳到標記函式起點的記憶體單元,執行函式**(也許還要將返回值放入到暫存器中),然後跳回到位址儲存的指令處。來回跳躍並記錄跳躍位置意味著以前使用函式時,需要一定的開銷。

c++內聯函式提供另一種選擇。內聯函式的編譯**與其他程式**「內聯」起來了。也就是說,編譯器將使用相應的函式**替換函式呼叫。對於內聯**,程式無需跳到另乙個位置處執行**,再跳回來。因此,內聯函式執行比常規函式快,但需要占用更多的記憶體。所以應選擇性的使用內連函式。執行函式**時間比處理函式呼叫時間長,則節省時間佔整個過程的很小一部分。如果執行**時間短,則內聯呼叫則可以節約大部分時間。但由於這個過程非常快,儘管節約了大部分時間,但時間的絕對值並不大,除非該函式經常被呼叫。

節省時間但是消耗空間。

三、使用

在函式宣告前加上關鍵字inline;

在函式定義前加上關鍵字inline;

(以上採取之一即可)

四、inline函式的規則

(1)、乙個函式可以自已呼叫自已,稱為遞迴呼叫,含有遞迴呼叫的函式不能設定為inline;

(2)、使用了複雜流程控制語句:迴圈語句和switch語句,無法設定為inline;

(3)、由於inline增加體積的特性,所以建議inline函式內的**應很短小。最好不超過5行。

(4)、inline僅做為一種「請求」,特定的情況下,編譯器將不理會inline關鍵字,而強制讓函式成為普通函式。出現這種情況,編譯器會給出警告訊息。

(5)、在你呼叫乙個內聯函式之前,這個函式一定要在之前有宣告或已定義為inline,如果在前面宣告為普通函式,而在呼叫**後面才定義為乙個inline函式,程式可以通過編譯,但該函式沒有實現inline。

#include

using

namespace

std;

inline

double square(double x)

int main()

該函式輸出:

a = 25, b = 144;

c = 13, c square = 169;

new c = 14;

輸出表明,內聯函式和常規函式一樣都是按值傳遞。

五、內聯與巨集

如果以上用巨集:

#define square(x) x*x;

則程式輸出:new c = 15

表明巨集不是按值傳遞。

C 之內聯函式

內聯函式是一種特殊的函式,具有普通函式的特徵 引數檢查,返回型別等 內聯函式是對編譯器的一種請求,因此編譯器可能拒絕這種請求 內聯函式由 編譯器處理,直接將編譯後的函式體插入呼叫的地方 巨集 片段 由預處理器處理,進行簡單的文字替換,沒有任何編譯過程 注 內聯函式宣告時inline關鍵字必須和函式定...

c 之內聯函式

若有不對,歡迎道友予以指正,提前謝過。內聯函式 定義時需要關鍵字inline。實際上是和巨集定義一般,在呼叫函式的地方,用函式體進行替換。inline需要在函式定義的時候加入才有效,在宣告的時候不需要 而類宣告中的成員函式自動成為內聯函式。tip 只有當函式只有 10 行甚至更少時才將其定義為內聯函...

c 之內聯函式

定義 c 內聯函式是通常與類一起使用。如果乙個函式是內聯的,那麼在編譯時,編譯器會把該函式的 副本放置在每個呼叫該函式的地方。以inline修飾的函式叫內聯函式。編譯時c 編譯器會在呼叫內聯函式的地方展開,沒有函式壓棧的開銷,內聯函式提公升程式執行的效率。如果想把乙個函式定義為內聯函式,則需要在函式...