對內聯函式與普通函式的一些比較與分析

2021-04-20 14:22:07 字數 1667 閱讀 2855

本文出處:http://blog.csdn.net/closeall2008

我們知道c++通過內聯函式對c語言進行了擴充,從而在某種程度上對程式的執行效率進行改

進。然而普通函式與內聯函式的區別不在於它們的編寫方式上,而在於c++編譯器對它們的理解、

解釋。要想對內聯函式有比較深入的理解,我們必須深入到函式的內部。

我們知道**經過編譯器進行編譯後,把我們寫的程式語句翻譯成了機器可以識別的機器指令,然

後進行連線,從而生成可執行程式。當程式執行時,系統把機器指令調入記憶體,因而每條指令都有

位址。機器就按照你的程式的邏輯順序執行這些機器指令,但並不是每條指令都會執行,有的指令

會被跳過去的,如:if語句中的一些指令。所以指令的執行並不是順序的,存在著一些跳轉。那麼普

通的函式是怎麼來執行的呢?下面我來分析:當程式執行到呼叫函式的指令得時候,把呼叫指令的

位址紀錄下來,然後通過函式的位址(任何一條指令都會有乙個記憶體位址,當然函式也不例外的)

會跳到函式本身定義時的指令處,把傳遞給函式的實際引數複製後傳給函式得形參放入堆疊,然後

執行函式內部的指令。函式的內部指令執行完畢後,根據呼叫函式的那個指令的位址,返回到原來

地方,從而繼續執行下面的指令。因為執行普通函式呼叫的時候存在著記錄位址、跳轉等操作,所

以存在著一些額外的開銷。而內聯函式使用另外的機制,它不用於普通函式的呼叫。當指令執行到

內聯函式的時候,並不進行記錄位址和跳轉的操作,而相當於把內聯函式內部的指令拷貝在呼叫的

地方,而順序的執行下去。這樣內聯函式不存在跳轉,因而執行時速度會比普通函式的呼叫稍快一

些的,但是它會占用更多的記憶體,呼叫內聯函式的次數越多,所占用的記憶體就會越大,因為每乙個

存在內聯函式呼叫的地方,都相當於對內聯函式進行了一次拷貝。如果有10個內聯函式得呼叫,程

序中就存在10個內聯函式的拷貝,有100個呼叫就有100個拷貝。所以一般對小型的函式才使用內聯

函式。還有一點是,如果函式體本身執行的時間比較長,而使用內聯函式所節省的那點時間對於這

個時間來說很少,在這個時候不要使用內聯函式,畢竟函式體過大,會占用很多的記憶體空間的。還

有一些內容是比較容易忽視的,下面我來說幾點:首先,編譯器並不會把你所定義的每乙個內聯函

數在編譯的時候都看成是內聯函式的,這要根據的編譯器而定,在編譯的時候編譯器會檢查你所定

義的內聯函式是不是符合要求,或者是說存在其他的一些別的原因,編譯器會視情況而定。其次,

內聯函式是不允遞迴的,這一點一定要記住的。以上兩點,很多的書籍上都不會提起到,這是需要

讀者注意的地方。

那麼內聯函式在什麼地方定義呢?定義內聯函式乙個比較習慣性的做法是在標頭檔案中定義。還有就是,

內聯函式一般不用宣告的,它在標頭檔案中直接定義內聯函式,相當於宣告

和定義同時進行了,我們知道這樣做是允許的,因為它是在標頭檔案中,但是我們不要在標頭檔案中定

義處內聯函式之外的其他任何函式。

對於具體如何定義內聯函式,我也不想多說的,只需在函式前加上inline 就行了,因為具體的定義

做起來很簡單的,在任何乙個基礎性的書上都會有這方面的介紹說明。其實對於內聯函式還有其

他的一些內容,我在這裡就不多說了。

msn: [email protected]

e_mail & gtalk :

[email protected]

巨集函式與內聯函式比較

第一部分 巨集 為什麼要使用巨集呢?因為函式的呼叫必須要將程式執行的順序轉移到函式所存放在記憶體中的某個位址,將函式的程式內容執行完後,再返回到轉去執行該函式前的地方。這種轉移操作要求在轉去執行前要儲存現場並記憶執行的位址,轉回後要恢復現場,並按原來儲存位址繼續執行。因此,函式呼叫要有一定的時間和空...

內聯函式(inline)與普通函式的區別

內聯函式是 被插入到呼叫者 處的函式。如同 define 巨集,內聯函式通過避免被呼叫的開銷來提高執行效率,尤其是它能夠通過呼叫 過程化整合 被編譯器優化。內 聯函式和巨集很類似,而區別在於,巨集是由預處理器對巨集進行替代,而內聯函式是通過編譯器控制來實現的。而且內聯函式是真正的函式,只是在需要用到...

建構函式與普通函式的比較

在js中,用new關鍵字來呼叫定義的建構函式。預設返回的是乙個新的物件具有建構函式定義的變數和方法。先來寫個建構函式的例子 function prince name,age prince.prototype.tofrog function var prince new prince charming...