更新於 2024/12/06閱讀時間約 3 分鐘

【Kotlin 入門指南】匿名函數-Inline 內聯函數

【Kotlin 入門指南】系列文章目錄:https://bit.ly/3t8awwL
Kotlin 線上課程教學影片:https://bit.ly/3qJ5a5Q

Inline內聯函數

在 Kotlin 中,使用函數當參數傳遞,記得將此函數前面加入 inline 關鍵字,它能有效減少函數呼叫所造成的資源消耗。若沒有使用 Inline 內聯此函數,會導致每個函數都被實體化 (Instance) 出來。

inline fun showGreeting(name: String, msg: String, greeting: (String, String) -> String) {
println(greeting(name, msg))
}

fun main() {
showGreeting("HKT", "今天過得好嗎?") { name: String, msg: String ->
"哈囉~ $name, $msg"
}
}

有加 inline 反編譯 showGreeting

...
...
...

public static final void main() {
String name$iv = "HKT";
String msg$iv = "今天過得好嗎?";
int $i$f$showGreeting = false;
int var5 = false;
String var4 = "哈囉~ " + name$iv + ", " + msg$iv;
System.out.println(var4);
}

...
...
...

可以看到原本呼叫函數要執行的內容,被複製到呼叫函數的地方。這就是加入 inline 的效果。當函數被 inline 修飾時,原本函數呼叫的內容會被複製到呼叫函數的地方。這樣能夠節省實體化所帶來的效能開銷。

沒有加 inline 反編譯 showGreeting

...
...
...

public static final void main() {
showGreeting("HKT", "今天過得好嗎?", (Function2)null.INSTANCE);
}
...
...
...

反編譯可以看到,在沒有加入 inline 關鍵字的情況下,會出現 INSTANCE。

在沒有使用 inline 關鍵字的情況下,反編譯後的程式碼中會出現 INSTANCE。這顯示了沒有使用 inline 所造成的效能差異,因為程式碼並未在呼叫處被複製,而是保持了原本的呼叫方式,導致實體化的成本增加。


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.