Skip to content

内联函数

1. 什么是内联函数

  1. 在普通函数前面加上inline,代码示例:
kotlin
// 在 main() 中调用 makeTest()
fun main() {
    Log.i("zc_test", "main() start")
    makeTest()
    Log.i("zc_test", "main() end")
}
// 内联函数 makeTest()
private inline fun makeTest() {
    Log.i("zc_test", "makeTest")
}
  1. 使用inline编译成的java代码
java
public final void main() {
    Log.i("zc_test", "main() start");
    int $i$f$makeTest = false;
    Log.i("zc_test", "makeTest");
    Log.i("zc_test", "main() end");
}
  1. 当 makeTest() 不在被 inline 修饰时, 被编辑成 java 的代码为:
java
public final void main() {
    Log.i("zc_test", "main() start");
    this.makeTest();
    Log.i("zc_test", "main() end");
}

当 makeTest() 被inline 修饰时, 在 main() 中原来调用 makeTest() 的地方被替换成了 makeTest() 里面的代码。 也就是说在编译时期,把调用这个函数的地方用这个函数的方法体进行替换

DANGER

inline 不适合在无参数的函数中,适合在包含 lambda 参数的函数上。

例如:

kotlin
// body 是本身一个函数
fun foo(body:() -> Unit) {
    println("foo() hahaha")
    ordinaryFunction(body)
}

inline fun ordinaryFunction(block: () -> Unit) {
    println("hahha")
    block.invoke()
    println("hahha233333")
}

2. 内联函数有什么好处

Released under the MIT License.