聲明: 本文可以不經作者同意, 任意複製, 轉載, 但任何對本文的引用都請保留文章的作者, 出處以及聲明信息. 謝謝.
我們知道c++通過內聯函數對c語言進行了擴充,從而在某種程度上對程序的運行效率進行改
進。然而普通函數與內聯函數的區別不在於它們的編寫方式上,而在於c++編譯器對它們的理解、
解釋。要想對內聯函數有比較深入的理解,我們必須深入到函數的內部。
我們知道代碼經過編譯器進行編譯後,把我們寫的程序語句翻譯成了機器可以識別的機器指令,然
後進行連接,從而生成可執行程序。當程序運行時,系統把機器指令調入內存,因而每條指令都有
地址。機器就按照你的程序的邏輯順序執行這些機器指令,但並不是每條指令都會運行,有的指令
會被跳過去的,如:if語句中的一些指令。所以指令的執行並不是順序的,存在着一些跳轉。那麼普
通的函數是怎麼來運行的呢?下面我來分析:當程序運行到調用函數的指令得時候,把調用指令的
地址紀錄下來,然後通過函數的地址(任何一條指令都會有一個內存地址,當然函數也不例外的)
會跳到函數本身定義時的指令處,把傳遞給函數的實際參數複製後傳給函數得形參放入堆棧,然後
執行函數內部的指令。函數的內部指令執行完畢後,根據調用函數的那個指令的地址,返回到原來
地方,從而繼續執行下面的指令。因爲執行普通函數調用的時候存在着記錄地址、跳轉等操作,所
以存在着一些額外的開銷。而內聯函數使用另外的機制,它不用於普通函數的調用。當指令執行到
內聯函數的時候,並不進行記錄地址和跳轉的操作,而相當於把內聯函數內部的指令拷貝在調用的
地方,而順序的執行下去。這樣內聯函數不存在跳轉,因而執行時速度會比普通函數的調用稍快一
些的,但是它會佔用更多的內存,調用內聯函數的次數越多,所佔用的內存就會越大,因爲每一個
存在內聯函數調用的地方,都相當於對內聯函數進行了一次拷貝。如果有10個內聯函數得調用,程
序中就存在10個內聯函數的拷貝,有100個調用就有100個拷貝。所以一般對小型的函數才使用內聯
函數。還有一點是,如果函數體本身執行的時間比較長,而使用內聯函數所節省的那點時間對於這
個時間來說很少,在這個時候不要使用內聯函數,畢竟函數體過大,會佔用很多的內存空間的。還
有一些內容是比較容易忽視的,下面我來說幾點:首先,編譯器並不會把你所定義的每一個內聯函
數在編譯的時候都看成是內聯函數的,這要根據的編譯器而定,在編譯的時候編譯器會檢查你所定
義的內聯函數是不是符合要求,或者是說存在其他的一些別的原因,編譯器會視情況而定。其次,
內聯函數是不允遞歸的,這一點一定要記住的。以上兩點,很多的書籍上都不會提起到,這是需要
讀者注意的地方。
那麼內聯函數在什麼地方定義呢?定義內聯函數一個比較習慣性的做法是在頭文件中定義。還有就是,
內聯函數一般不用聲明的,它在頭文件中直接定義內聯函數,相當於聲明
和定義同時進行了,我們知道這樣做是允許的,因爲它是在頭文件中,但是我們不要在頭文件中定
義處內聯函數之外的其他任何函數。
對於具體如何定義內聯函數,我也不想多說的,只需在函數前加上inline 就行了,因爲具體的定義
做起來很簡單的,在任何一個基礎性的書上都會有這方面的介紹說明。其實對於內聯函數還有其
他的一些內容,我在這裏就不多說了。
MSN: [email protected]
E_mail & GTalk : [email protected]