天天看點

Java 内聯函數

1 内聯函數的定義

     内聯函數就是指函數在被調用的地方直接展開,編譯器在調用時不用像一般函數那樣,參數壓棧,傳回時參數出棧以及資源釋放等,這樣提高了程式執行速度。實際上就是用空間來換時間。

2 函數調用過程分析

    調用某個函數實際上将程式執行順序轉移到該函數所存放在記憶體中某個位址,将函數的程式内容執行完後,再傳回到轉去執行該函數前的地方。這種轉移操作要求在轉去前要保護現場并記憶執行的位址,轉回後先要恢複現場,并按原來儲存位址繼續執行。也就是通常說的壓棧和出棧。是以,函數調用要有一定的時間和空間方面的開銷。那麼對于那些函數體代碼不是很大,又頻繁調用的函數來說,這個時間和空間的消耗會很大。     為了解決這個問題,需要引入内聯函數。在程式編譯時,編譯器将程式中出現的内聯函數的調用表達式用内聯函數的函數體來直接進行替換。顯然,這樣就不會産生轉去轉回的問題,但是由于在編譯時将函數體中的代碼被替代到程式中,是以會增加目标程式代碼量,進而增加空間開銷。

3 Java中的内聯函數

    内聯不一定好,當被指定為内聯的方法體很大時,展開的開銷可能就已經超過了普通函數調用調用的時間,引入了内聯反而降低了性能。是以,是否是内聯函數,不是由程式員決定的,而是由編譯器決定的。

    一般的函數都不會被當做内聯函數,隻有聲明了final後,編譯器才會考慮是不是要把你的函數變成内聯函數。也就是說,final關鍵字隻是告訴編譯器,在編譯的時候考慮性能的提升,可以将final函數視為内聯函數。但最後編譯器會怎麼處理,編譯器會分析将final函數處理為内聯和不處理為内聯的性能比較了。 

public final void inLineFunc() {
		// to do something
}
           

    注意: C++是否為内聯函數由自己決定,Java由編譯器決定。