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