Kotlin 進階用法: 內聯函數

繼上一篇文章給大家介紹完kotlin的擴展,這篇文章給大家講講kotlin中內聯函數的用法。

什麼是內聯函數

內聯函數:在程序編譯時能將程序中內聯函數的調用表達式直接替換成內聯函數的函數體。 關鍵字:inline

看一個例子:

fun test() {
  var x = 1
  hello()
  print(x)
}

inline fun hello() {
    var a = 1
    var b = 1
    var c = a + b
    print(c)
}

這是我們在編譯器上編寫看到的代碼,而實際編譯的時候會變成

fun test() {
  var x = 1
  var a = 1
  var b = 1
  var c = a + b
  print(c)
  print(x)
}

但實際上如果你這麼寫,你會發現編譯器會給你一個警告提醒,大致意思是說不建議你在這裏使用內聯函數,可能得不到收益。原因下面解釋。

爲什麼要使用內聯函數

在講這個問題之前,我們先來講解幾個概念 1.高階函數 高階函數是將函數用作參數或返回值的函數。 2.lambda 表達式 描述函數的一種簡潔的方式 所以我們經常會看到kotlin裏面使用lambda表達式作爲一個函數參數傳遞給其它函數。這個過程其實產生了很多隱性的開銷。

  • lambda函數會被編譯爲函數對象(空間開銷)
  • 如果lambda函數的輸入輸出爲原始數據類型,需要額外的裝箱,拆箱操作
  • 應用的方法總數會增加3-4個
  • 在執行實際的函數調用時,增加了函數壓棧出棧等調用的時間開銷

而kotlin中的內聯函數,很巧妙地解決了這一問題。我們只需要將高階函數聲明爲內聯,參數中的lambda函數也會自動變成內聯。即可避免以上說到的開銷,當然是以增加代碼量的代價換取。 所以可能的話,儘量將高階函數聲明爲內聯,保持代碼行數爲一個較小的數字,將大塊代碼移動到非內聯函數中。

inline fun doCal(a: Int, b: Int, cal: (a: Int, b: Int) -> Int): Int {
  return cal(a, b)
}

如果不希望lambda函數變成內聯,可以使用noinline關鍵字:

inline fun doCal(a: Int, b: Int, noinline cal: (a: Int, b: Int) -> Int): Int {
  return cal(a, b)
}

相信大家現在已經知道該什麼時候使用內聯函數了。

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