最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Kotlin中關(guān)于內(nèi)聯(lián)函數(shù)的一些理解分享

 更新時間:2018年07月09日 08:57:04   作者:淚已無痕  
這篇文章主要給大家介紹了關(guān)于Kotlin中內(nèi)聯(lián)函數(shù)的一些理解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧

前言

看了很多博客,才明白了內(nèi)聯(lián)的含義,其實最根本的就是將寫在別處的代碼拷貝到你現(xiàn)在執(zhí)行的方法中,相當于在一個方法中執(zhí)行,java的方法執(zhí)行是需要壓棧出棧的對吧,如果是兩三個方法那就是兩三次的壓棧出棧,為了節(jié)省這個操作,提高一定的效率,kotlin就出了這么個函數(shù)。但又想想,如果是個超級大的函數(shù),考來考去的也是很麻煩啊,所以這東西需要自己權(quán)衡吧,遵守單一職責,降低代碼圈發(fā)雜度才是根本。

內(nèi)聯(lián)函數(shù)的理解

inline函數(shù)(內(nèi)聯(lián)函數(shù))從概念上講是編譯器使用函數(shù)實現(xiàn)的真實代碼來替換每一次的函數(shù)調(diào)用,帶來的最直接的好處就是節(jié)省了函數(shù)調(diào)用的開銷,而缺點就是增加了所生成字節(jié)碼的尺寸。基于此,在代碼量不是很大的情況下,我們是否有必要將所有的函數(shù)定義為內(nèi)聯(lián)?讓我們分兩種情況進行說明:

  1. 將普通函數(shù)定義為內(nèi)聯(lián):眾所周知,JVM內(nèi)部已經(jīng)實現(xiàn)了內(nèi)聯(lián)優(yōu)化,它會在任何可以通過內(nèi)聯(lián)來提升性能的地方將函數(shù)調(diào)用內(nèi)聯(lián)化,并且相對于手動將普通函數(shù)定義為內(nèi)聯(lián),通過JVM內(nèi)聯(lián)優(yōu)化所生成的字節(jié)碼,每個函數(shù)的實現(xiàn)只會出現(xiàn)一次,這樣在保證減少運行時開銷的同時,也沒有增加字節(jié)碼的尺寸;所以我們可以得出結(jié)論,對于普通函數(shù),我們沒有必要將其聲明為內(nèi)聯(lián)函數(shù),而是交給JVM自行優(yōu)化。
  2. 將帶有l(wèi)ambda參數(shù)的函數(shù)定義為內(nèi)聯(lián):是的,這種情況下確實可以提高性能;但在使用的過程中,我們會發(fā)現(xiàn)它是有諸多限制的,讓我們從下面的例子開始展開說明:
inline fun doSomething(action: () -> Unit) {
 println("Before doSomething...")
 action()
 println("After doSomething...")
}

假如我們這樣調(diào)用doSomething:

fun main(args: Array<String>) {
 doSomething {
  pringln("Hello World")
 }
} 

上面的調(diào)用會被編譯成:

fun main(args: Array<String>) {
 println("Before doSomething...")
 println("Hello World")
 println("After doSomething...")
}

從上面編譯的結(jié)果可以看出,無論doSomething函數(shù)還是action參數(shù)都被內(nèi)聯(lián)了,很棒,那讓我們換一種調(diào)用方式:

fun main(args: Array<String>) {
 val action:() -> Unit = { println("Hello World") }
 doSomething(action)
}

上面的調(diào)用會被編譯成:

fun main(args: Array<String>) {
 println("Before doSomething...")
 action()
 println("After doSomething...")
}

doSomething函數(shù)被內(nèi)聯(lián),而action參數(shù)沒有被內(nèi)聯(lián),這是因為以函數(shù)型變量的形式傳遞給doSomething的lambda在函數(shù)的調(diào)用點是不可用的,只有等到doSomething被內(nèi)聯(lián)后,該lambda才可以正常使用。

通過上面的例子,我們對lambda表達式何時被內(nèi)聯(lián)做一下簡單的總結(jié):

  • 當lambda表達式以參數(shù)的形式直接傳遞給內(nèi)聯(lián)函數(shù),那么lambda表達式的代碼會被直接替換到最終生成的代碼中。
  • 當lambda表達式在某個地方被保存起來,然后以變量形式傳遞給內(nèi)聯(lián)函數(shù),那么此時的lambda表達式的代碼將不會被內(nèi)聯(lián)。

上面對lambda的內(nèi)聯(lián)時機進行了討論,消化片刻后讓我們再看最后一個例子:

inline fun doSomething(action: () -> Unit, secretAction: () -> Unit) {
 action()
 doSomethingSecret(secretAction)
}

fun doSomethingSecret(secretAction: () -> Unit) {
}

上面的例子是否有問題?是的,編譯器會拋出“Illegal usage of inline-parameter”的錯誤,這是因為Kotlin規(guī)定內(nèi)聯(lián)函數(shù)中的lambda參數(shù)只能被直接調(diào)用或者傳遞給另外一個內(nèi)聯(lián)函數(shù),除此之外不能作為他用;那我們?nèi)绻_實想要將某一個lambda傳遞給一個非內(nèi)聯(lián)函數(shù)怎么辦?我們只需將上述代碼這樣改造即可:

inline fun doSomething(action: () -> Unit, noinline secretAction: () -> Unit) {
 action()
 doSomethingSecret(secretAction)
}

fun doSomethingSecret(secretAction: () -> Unit) {
}

很簡單,在不需要內(nèi)聯(lián)的lambda參數(shù)前加上noinline修飾符就可以了。

以上便是我對內(nèi)聯(lián)函數(shù)的全部理解,通過掌握該特性的運行機制,相信大家可以做到在正確的時機使用該特性,而非濫用或因恐懼棄而不用。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Android植物大戰(zhàn)僵尸小游戲

    Android植物大戰(zhàn)僵尸小游戲

    植物大戰(zhàn)僵尸小游戲,無論老少皆愛,非常有意思,具有挑戰(zhàn)性,那么基于代碼是怎么實現(xiàn)的呢?下面通過本文給大家介紹Android植物大戰(zhàn)僵尸小游戲,感興趣的朋友一起學(xué)習吧
    2015-12-12
  • android studio實現(xiàn)簡單考試應(yīng)用程序?qū)嵗a詳解

    android studio實現(xiàn)簡單考試應(yīng)用程序?qū)嵗a詳解

    這篇文章主要介紹了android studio實現(xiàn)簡單考試應(yīng)用程序,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Android編程實現(xiàn)Listview點擊展開和隱藏的方法

    Android編程實現(xiàn)Listview點擊展開和隱藏的方法

    這篇文章主要介紹了Android編程實現(xiàn)Listview點擊展開和隱藏的方法,涉及Android中Listview的響應(yīng)點擊與樣式變換相關(guān)操作技巧,需要的朋友可以參考下
    2015-12-12
  • Android內(nèi)存泄漏導(dǎo)致原因深入探究

    Android內(nèi)存泄漏導(dǎo)致原因深入探究

    內(nèi)存管理的目的就是讓我們在開發(fā)過程中有效避免我們的應(yīng)用程序出現(xiàn)內(nèi)存泄露的問題。內(nèi)存泄露相信大家都不陌生,我們可以這樣理解:沒有用的對象無法回收的現(xiàn)象就是內(nèi)存泄露
    2023-02-02
  • android事件總線EventBus3.0使用方法詳解

    android事件總線EventBus3.0使用方法詳解

    這篇文章主要為大家詳細介紹了android事件總線EventBus3.0使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Android實現(xiàn)自動文本框提示功能

    Android實現(xiàn)自動文本框提示功能

    這篇文章主要為大家詳細介紹了Android實現(xiàn)自動文本框提示功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Android清除工程中無用資源文件的兩種方法

    Android清除工程中無用資源文件的兩種方法

    這篇文章主要介紹了Android清除工程中無用資源文件的兩種方法,調(diào)用Android lint命令查找出無用資源,二是使用代碼自動刪除無用的文件,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Android清空應(yīng)用內(nèi)部文件緩存

    Android清空應(yīng)用內(nèi)部文件緩存

    這篇文章主要介紹了Android清空應(yīng)用內(nèi)部文件緩存的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Android動畫之小球擬合動畫實例

    Android動畫之小球擬合動畫實例

    這篇文章主要介紹了Android動畫之小球擬合動畫實例的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Android ListView控件使用方法

    Android ListView控件使用方法

    這篇文章主要為大家詳細介紹了Android ListView控件的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評論

康保县| 安平县| 肃北| 和政县| 道孚县| 磐安县| 武邑县| 西贡区| 双峰县| 海原县| 濮阳县| 公安县| 延庆县| 洮南市| 封开县| 宜州市| 鸡泽县| 正安县| 陇西县| 台中市| 黔江区| 灵山县| 芷江| 昭觉县| 五峰| 合作市| 灵川县| 溆浦县| 大庆市| 精河县| 额尔古纳市| 浦城县| 南京市| 临洮县| 苏尼特右旗| 渭源县| 石景山区| 巴南区| 大石桥市| 本溪市| 拉孜县|