Kotlin - inline 簡單理解

本文分2部分
1,inline 簡單分析
2,inline 使用場景

一、inline 簡單理解

個人理解

  • 使用 inline 關(guān)鍵字,編譯時會將代碼拷貝到調(diào)用的位置,以提高效率。

通過 內(nèi)置的Let 函數(shù),這個一個簡單例子解釋一下:

@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block(this)
}

將高階函數(shù) letinline 關(guān)鍵字刪除,如下:

 fun <T, R> T.let2(block: (T) -> R): R {
    return block(this)
}

測試代碼,僅打印出了日志:

class Test {
    fun doTest() {
        val name="zhangsan"
        name.let {
            Log.d("Kotlin- test : ", it)
        }

        val name2="zhangsan2"
        name2.let2 {
            Log.d("Kotlin- test2 : ", it)
        }
    }
}
//無 inline 關(guān)鍵字
 fun <T, R> T.let2(block: (T) -> R): R {
    return block(this)
}

通過 ide 反編譯 kt 代碼,查看區(qū)別:

反編譯kt.png

上圖可以看出,編譯器將 name1 調(diào)用的代碼,直接 copy到了調(diào)用的地方,故可以簡單理解為:使用 inline 會將代碼 copy 到使用處。

附:Android studio 如何反編譯 kt代碼

步驟-1.png

步驟-2.png

二,上面簡單介紹了一下 inline 繼續(xù)分析一下inline 使用

思考:使用 inline 后,會將代碼 拷貝 到調(diào)用處。如果方法特別長,拷貝這樣過去,會不會使代碼過于臃腫,給 JVM虛擬機造成負擔。 如果是這樣的話,那么 inline 是為了解決什么問題?

inline 出現(xiàn),為了解決 Lambda 帶來的額外開銷

通過一個測試代碼簡單描述一下:

1,未使用 inline 反編譯出的結(jié)果為,testLambda 方法每次調(diào)用的時候,都 新建了一個實例

未使用 inline.png

image.png

2,使用inline 反編譯出的結(jié)果為:

image.png

個人理解:實際開發(fā)中,如果在使用 Lambda 表達式 并且代碼相對較短的時候,可以考慮使用inline,否則正常寫即可。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容