Kotlin - inline 简单理解

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

一、inline 简单理解

个人理解

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

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

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

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

 fun  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.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 简单理解)