欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

扣丁學(xué)堂Android培訓(xùn)之Kotlin內(nèi)聯(lián)函數(shù)分享

2018-07-09 13:38:01 1497瀏覽

今天扣丁學(xué)堂小編給大家介紹一下關(guān)于Android培訓(xù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)?讓我們分兩種情況進行說明:

將普通函數(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)化。

將帶有l(wèi)ambda參數(shù)的函數(shù)定義為內(nèi)聯(lián):是的,這種情況下確實可以提高性能;但在使用的過程中,我們會發(fā)現(xiàn)它是有諸多限制的,讓我們從下面的例子開始展開說明:

inlinefundoSomething(action:()->Unit){
println("BeforedoSomething...")
action()
println("AfterdoSomething...")
}

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

funmain(args:Array<String>){
doSomething{
pringln("HelloWorld")
}
}

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

funmain(args:Array<String>){
println("BeforedoSomething...")
println("HelloWorld")
println("AfterdoSomething...")
}

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

funmain(args:Array<String>){
valaction:()->Unit={println("HelloWorld")}
doSomething(action)
}

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

funmain(args:Array<String>){
println("BeforedoSomething...")
action()
println("AfterdoSomething...")
}

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)時機進行了討論,消化片刻后讓我們再看最后一個例子:

inlinefundoSomething(action:()->Unit,secretAction:()->Unit){
action()
doSomethingSecret(secretAction)
}
fundoSomethingSecret(secretAction:()->Unit){
}

上面的例子是否有問題?是的,編譯器會拋出“Illegalusageofinline-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ù)怎么辦?我們只需將上述代碼這樣改造即可:

inlinefundoSomething(action:()->Unit,noinlinesecretAction:()->Unit){
action()
doSomethingSecret(secretAction)
}
fundoSomethingSecret(secretAction:()->Unit){
}

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

以上就是關(guān)于扣丁學(xué)堂Android培訓(xùn)之Kotlin內(nèi)聯(lián)函數(shù)的詳細技術(shù),希望本文的內(nèi)容對學(xué)習Android開發(fā)費有深入的了解,如果你想學(xué)習更多的Android知識,對Android有全面的了解,請關(guān)注扣丁學(xué)堂微信公眾號,或登錄扣丁學(xué)堂官網(wǎng)了解更多,還有大量Android在線視頻教程等著你來觀看。

扣丁學(xué)堂微信公眾號



【關(guān)注微信公眾號獲取更多學(xué)習資料】



查看更多關(guān)于“Android開發(fā)技術(shù)的相關(guān)資訊>>

標簽: Android開發(fā)從入門到精通 Android學(xué)習路線圖 Android培訓(xùn) Android開發(fā)工程師 Android視頻教程

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國免費咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號中關(guān)村智誠科創(chuàng)大廈4層
京ICP備2021002079號-2   Copyright ? 2017 - 2022
返回頂部 返回頂部