内联函数inline

tech2022-09-22  68

内联函数 

内联函数 的语义很简单: 把函数体复制粘贴到函数调用处 。

inline fun myCalculate(a: Int, b: Int) = a + b fun test() { myCalculate(1, 2) myCalculate(3, 4) myCalculate(5, 6) }

 用关键字 inline 标记函数,该函数就是一个内联函数。还是原来的 test() 方法,编译器在编译的时候,会自动把内联函数 myCalculate() 方法体内的代码,替换到调用该方法的地方。查看编译后的字节码,会发现 test() 方法里已经没了对myCalculate() 方法的调用,凡是原来代码里出现 myCalculate() 方法调用的地方,出现的都是 myCalculate() 方法体内的字节码了

本着严谨科学的态度,我们还是来反编译验证一下。

inline fun test() { println("I'm a inline function") } fun run() { test() }

 在 run() 函数中调用了内联函数 test()。反编译查看对应的 java 代码:

public static final void test() { String var1 = "I'm a inline function"; System.out.println(var1); } public static final void run() { String var1 = "I'm a inline function"; System.out.println(var1); }

 可以看到 run() 函数中并没有直接调用 test() 函数,而是把 test() 函数的代码直接放入自己的函数体中。这就是 inline 的功效。

那么,问题就来了。这样就可以提高运行效率吗?如果可以,为什么?

对比java,函数反复调用时,会有压栈出栈的性能消耗,kotlin使用内联函数用来解决频繁调用某个函数导致的性能消耗。

JVM 已经提供了内联支持,所以没有必要在 Kotlin 中内联普通函数。

那么问题又来了。 既然 JVM 已经支持内联优化,Kotlin 的内联存在的意义是什么 ?

 答案就是 Lambda 。

详细说明可以看这篇文章https://www.jianshu.com/p/ab877fe72b40

最新回复(0)