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