欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Kotlin inline内联函数

程序员文章站 2022-03-15 16:31:37
...

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