天天看点

Kotlin inline内联函数

inline

  • 使用inline标识方法,下面是一个简单的例子,一个inline修饰的go()方法和一个run()方法,然后再main方法中调用。
object Text {


    inline fun go() {
        println("am fun go")
    }

    fun run() {
        println("am fun run")
    }

    @JvmStatic
    fun main(args: Array<String>) {
        val test = Text

        test.go()

        test.run()
    }

}

           

我们看一下这段代码反编译成java代码是什么样的。

public final class Text {
   public static final Text INSTANCE;

   public final void go() {
      String var2 = "am fun go";
      System.out.println(var2);
   }

   public final void run() {
      String var1 = "am fun run";
      System.out.println(var1);
   }

   @JvmStatic
   public static final void main(@NotNull String[] args) {
      Intrinsics.checkParameterIsNotNull(args, "args");
      Text test = INSTANCE;
      String var3 = "am fun go";
      System.out.println(var3);
      test.run();
   }

   static {
      Text var0 = new Text();
      INSTANCE = var0;
   }
}

           

我们直接看main方法就好了。重点是下面三行代码

String var3 = "am fun go";
      System.out.println(var3);
      test.run();
           

可以看到String var3 = “am fun go”; 和 System.out.println(var3); 是go方法的方法体,run()方法则直接通过test调用。也就是说 inline 修饰的函数会直接将其方法体copy到所调用的函数中执行,而不会像正常函数一样去调用。

那么这么做的好处是什么呢。首先需要了解一下栈帧的概念:

  • 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素。栈帧存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等信息。第一个方法从调用开始到执行完成,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

所以inline函数让调用者直接执行函数体,并是在编译期完成的所以,在实际执行的时候,减少了入栈和出栈的过程,提高了运行效率。