Kotlin 内联函数与普通函数区别
结论
1、普通函数在使用函数参数后,函数参数会被编译为内部类。
2、内联函数在使用函数参数后,函数参数的函数体会被拆解和内联函数体重组为新代码块,不会生成新的内部类。
实验
1、函数声明
//普通函数
fun inlineTest(s: String, t: (String) -> String) {
println(t(s))
}
//内联函数
inline fun inlineTest1(s: String, t: (String) -> String) {
println(t(s))
}
2、函数调用
val fn: (String) -> String = { s ->
println(s)
"fn $s"
}
//普通函数
inlineTest("inlineTest", fn)
//内联函数
inlineTest1("inlineTest1", fn)
//普通函数
inlineTest("111") { s ->
println(s)
"inlineTest $s"
}
//内联函数
inlineTest1("2222") { s ->
println(s)
"inlineTest1 $s"
}
3、查看kotlin编译字节码
4、反编译为java代码
5、反编译结果
Function1 fn = (Function1)null.INSTANCE;
//普通函数调用
this.inlineTest("inlineTest", fn);
//内联函数调用
String s$iv = "inlineTest1";
int $i$f$inlineTest1 = false;
Object var6 = fn.invoke(s$iv);
boolean var7 = false;
System.out.println(var6);
//普通函数调用
this.inlineTest("111", (Function1)null.INSTANCE);
//内联函数调用
s$iv = "2222";
$i$f$inlineTest1 = false;
var7 = false;
boolean var8 = false;
System.out.println(s$iv);
String var9 = "inlineTest1 " + s$iv;
var7 = false;
System.out.println(var9);
...
//普通函数
public final void inlineTest(@NotNull String s, @NotNull Function0 t) {
Intrinsics.checkParameterIsNotNull(s, "s");
Intrinsics.checkParameterIsNotNull(t, "t");
boolean var3 = false;
System.out.println(s);
t.invoke();
}
//内联函数
public final void inlineTest1(@NotNull String s, @NotNull Function0 t) {
int $i$f$inlineTest1 = 0;
Intrinsics.checkParameterIsNotNull(s, "s");
Intrinsics.checkParameterIsNotNull(t, "t");
boolean var4 = false;
System.out.println(s);
t.invoke();
}
附:Function1源码
public interface Function1<in P1, out R> : Function<R> {
/** Invokes the function with the specified argument. */
public operator fun invoke(p1: P1): R
}