美文网首页
Kotlin - inline 简单理解

Kotlin - inline 简单理解

作者: 徘徊0_ | 来源:发表于2022-04-06 17:19 被阅读0次

    本文分2部分
    1,inline 简单分析
    2,inline 使用场景

    一、inline 简单理解

    个人理解

    • 使用 inline 关键字,编译时会将代码拷贝到调用的位置,以提高效率。

    通过 内置的Let 函数,这个一个简单例子解释一下:

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

    将高阶函数 letinline 关键字删除,如下:

     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 关键字
     fun <T, R> T.let2(block: (T) -> R): R {
        return block(this)
    }
    

    通过 ide 反编译 kt 代码,查看区别:

    反编译kt.png

    上图可以看出,编译器将 name1 调用的代码,直接 copy到了调用的地方,故可以简单理解为:使用 inline 会将代码 copy 到使用处。

    附:Android studio 如何反编译 kt代码

    步骤-1.png
    步骤-2.png

    二,上面简单介绍了一下 inline 继续分析一下inline 使用

    思考:使用 inline 后,会将代码 拷贝 到调用处。如果方法特别长,拷贝这样过去,会不会使代码过于臃肿,给 JVM虚拟机造成负担。 如果是这样的话,那么 inline 是为了解决什么问题?

    inline 出现,为了解决 Lambda 带来的额外开销

    通过一个测试代码简单描述一下:

    1,未使用 inline 反编译出的结果为,testLambda 方法每次调用的时候,都 新建了一个实例

    未使用 inline.png
    image.png

    2,使用inline 反编译出的结果为:

    image.png

    个人理解:实际开发中,如果在使用 Lambda 表达式 并且代码相对较短的时候,可以考虑使用inline,否则正常写即可。

    相关文章

      网友评论

          本文标题:Kotlin - inline 简单理解

          本文链接:https://www.haomeiwen.com/subject/alnrsrtx.html