天天看點

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函數讓調用者直接執行函數體,并是在編譯期完成的是以,在實際執行的時候,減少了入棧和出棧的過程,提高了運作效率。