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

本文出處:http://blog.csdn.net/closeall2008
聲明: 本文可以不經作者同意, 任意複製, 轉載, 但任何對本文的引用都請保留文章的作者, 出處以及聲明信息. 謝謝.     

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

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

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

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

後進行連接,從而生成可執行程序。當程序運行時,系統把機器指令調入內存,因而每條指令都有

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

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

通的函數是怎麼來運行的呢?下面我來分析:當程序運行到調用函數的指令得時候,把調用指令的

地址紀錄下來,然後通過函數的地址(任何一條指令都會有一個內存地址,當然函數也不例外的)

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

執行函數內部的指令。函數的內部指令執行完畢後,根據調用函數的那個指令的地址,返回到原來

地方,從而繼續執行下面的指令。因爲執行普通函數調用的時候存在着記錄地址、跳轉等操作,所

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

內聯函數的時候,並不進行記錄地址和跳轉的操作,而相當於把內聯函數內部的指令拷貝在調用的

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

些的,但是它會佔用更多的內存,調用內聯函數的次數越多,所佔用的內存就會越大,因爲每一個

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

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

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

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

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

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

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

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

讀者注意的地方。

那麼內聯函數在什麼地方定義呢?定義內聯函數一個比較習慣性的做法是在頭文件中定義。還有就是,

內聯函數一般不用聲明的,它在頭文件中直接定義內聯函數,相當於聲明

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

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

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

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

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

 

MSN: [email protected]

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