内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

Kotlin中內(nèi)聯(lián)函數(shù)的示例分析-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)建站是一家專業(yè)提供白堿灘企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、網(wǎng)站建設(shè)、H5高端網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為白堿灘眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。

這篇文章將為大家詳細(xì)講解有關(guān)Kotlin中內(nèi)聯(lián)函數(shù)的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

內(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)?讓我們分兩種情況進(jì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)一次,這樣在保證減少運(yù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表達(dá)式何時被內(nèi)聯(lián)做一下簡單的總結(jié):

  • 當(dāng)lambda表達(dá)式以參數(shù)的形式直接傳遞給內(nèi)聯(lián)函數(shù),那么lambda表達(dá)式的代碼會被直接替換到最終生成的代碼中。

  • 當(dāng)lambda表達(dá)式在某個地方被保存起來,然后以變量形式傳遞給內(nèi)聯(lián)函數(shù),那么此時的lambda表達(dá)式的代碼將不會被內(nèi)聯(lián)。

上面對lambda的內(nèi)聯(lián)時機(jī)進(jì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ù)的全部理解,通過掌握該特性的運(yùn)行機(jī)制,相信大家可以做到在正確的時機(jī)使用該特性,而非濫用或因恐懼棄而不用。

關(guān)于“Kotlin中內(nèi)聯(lián)函數(shù)的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

當(dāng)前名稱:Kotlin中內(nèi)聯(lián)函數(shù)的示例分析-創(chuàng)新互聯(lián)
鏈接URL:http://www.rwnh.cn/article30/ccespo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、域名注冊、網(wǎng)站導(dǎo)航、手機(jī)網(wǎng)站建設(shè)面包屑導(dǎo)航、全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計公司
密山市| 容城县| 河东区| 霸州市| 金秀| 青川县| 托克逊县| 年辖:市辖区| 亚东县| 齐齐哈尔市| 贡嘎县| 苍梧县| 美姑县| 安仁县| 湘潭县| 新蔡县| 九龙县| 达日县| 韶关市| 常熟市| 柯坪县| 阿拉善右旗| 隆昌县| 南昌县| 堆龙德庆县| 资讯| 新野县| 什邡市| 海淀区| 景德镇市| 万安县| 永丰县| 镇宁| 莱州市| 万安县| 东明县| 河北省| 双柏县| 区。| 友谊县| 哈巴河县|