赞
踩
百度资深Android工程师T6,在百度任职7年半。
目前:成立赵小灰代码工作室,欢迎大家找我交流Android、微信小程序、鸿蒙项目。=
一:通俗易懂的人工智能教程:https://www.captainbed.cn/nefu/ 点一下,打开新世界的大门。
二:【一站式学会Kotlin】免费领取:作者微信(zhaoyangyangnefu)。
————————————————
内联函数是一种编程语言结构,用于建议编译器对一些特殊函数进行内联扩展,即在编译时将函数体嵌入每个调用处,以避免函数调用的开销,从而提高程序的运行效率。内联函数通过在函数定义前使用inline关键字来声明,这是一种对编译器的建议,告诉编译器在可能的情况下将函数的代码直接插入到程序中的每个调用点,而不是进行通常的函数调用。
内联函数的优点主要包括:
提高程序的运行速度,因为避免了函数调用的开销,如参数压栈、函数调用和返回时的现场保护与恢复等。
可以将函数定义放在头文件中,便于代码的复用。
内联函数的缺点包括:
可能会增大可执行程序的大小,因为函数的代码被直接插入到每个调用点。
如果内联函数发生改动,需要重新编译所有使用该函数的代码。
不是所有的函数都适合内联,对于复杂的、包含循环或递归的函数,内联可能会导致代码膨胀,降低编译器的优化效果。
fun cal(a: Int, b: Int, c: (str: String) -> String): Unit {
c("${a + b}")
}
调用这个函数:
cal(1, 2) { a: String ->
println(a + a + a)
a + a + a
}
cal(1, 2) { a: String ->
println(a + a)
a + a
}
翻译成java
this.cal(1, 2, (Function1)null.INSTANCE);
this.cal(1, 2, (Function1)null.INSTANCE);
看出啥来了,对 lamda表达式变成了2个对象,影响性能。这就带来一些运行时的内存开销。
现在我们换一种写法:在 cal函数前 + inline
inline fun cal(a: Int, b: Int, c: (str: String) -> String): Unit {
c("${a + b}")
}
翻译成java
byte a$iv = 1;
int b$iv = 2;
int $i$f$cal = false;
String a = String.valueOf(a$iv + b$iv);
int var7 = false;
String var8 = a + a + a;
System.out.println(var8);
(new StringBuilder()).append(a).append(a).append(a).toString();
a$iv = 1;
b$iv = 2;
$i$f$cal = false;
a = String.valueOf(a$iv + b$iv);
var7 = false;
var8 = a + a;
System.out.println(var8);
看出啥来了,对,这是把代码直接插入了调用的位置,这会增加代码量,但也减少了运行时的开销。Kotlin 是一种静态编程语言,同java一样的。此时,inline 的含义就是代码插入到调用的位置。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。