JAVA中的內聯函數


在說內聯函數之前,先說說函數的調用過程。

    調用某個函數實際上將程序執行順序轉移到該函數所存放在內存中某個地址,將函數的程序內容執行完后,再返回到
轉去執行該函數前的地方。這種轉移操作要求在轉去前要保護現場並記憶執行的地址,轉回后先要恢復現場,並按原來保
存地址繼續執行。也就是通常說的壓棧和出棧。因此,函數調用要有一定的時間和空間方面的開銷。那么對於那些函數體
代碼不是很大,又頻繁調用的函數來說,這個時間和空間的消耗會很大。

    那怎么解決這個性能消耗問題呢,這個時候需要引入內聯函數了。內聯函數就是在程序編譯時,編譯器將程序中出現
的內聯函數的調用表達式用內聯函數的函數體來直接進行替換。顯然,這樣就不會產生轉去轉回的問題,但是由於在編譯
時將函數體中的代碼被替代到程序中,因此會增加目標程序代碼量,進而增加空間開銷,而在時間代銷上不象函數調用時
那么大,可見它是以目標代碼的增加為代價來換取時間的節省。

    在大學里學習寫C代碼時,我們都學到將一些簡短的邏輯定義在宏里。這樣做的好處是,在編譯器編譯的時候會將用
到該宏的地方直接用宏的代碼替換。這樣就不再需要象調用方法那樣的壓棧、出棧,傳參了。性能上提升了。內聯函數的
處理方式與宏類似,但與宏又有所不同,內聯函數擁有函數的本身特性(類型、作用域等等)

    寫過C++代碼的應該都知道,在C++里有個內聯函數,使用inline關鍵字修飾。另外,寫在Class定義內的函數也會被
編譯器視為內聯函數。

那么,在java中的內聯函數長什么模樣呢?在java中使用final關鍵字來指示一個函數為內聯函數,例如:

Java代碼   收藏代碼
  1. public final void method1() {     
  2.    //TODO something     
  3. }  


    這個指示並不是必需的。final關鍵字只是告訴編譯器,在編譯的時候考慮性能的提升,可以將final函數視為內聯函數。
但最后編譯器會怎么處理,編譯器會分析將final函數處理為內聯和不處理為內聯的性能比較了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM