-
Notifications
You must be signed in to change notification settings - Fork 778
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
2019-10-21:在Kotlin中,什么是内联函数?有什么作用? #169
Comments
Kotlin里使用关键 inline 来表示内联函数,那么到底什么是内联函数呢,内联函数有什么好处呢?
也就是说每调用一个方法,都会对应一个栈帧的入栈出栈过程,如果你有一个工具类方法,在某个循环里调用很多次,那就会对应很多次的栈帧入栈、出栈过程。这里首先要记住的一点是,栈帧的创建及入栈、出栈都是有性能损耗的。下面以一个例子来说明,看段代码片段: fun test() { /**
fun test() {
} 定义内联函数: inline fun sum(vararg ints: Int): Int {
inline fun test(inlined: () -> Unit) {...} //内联函数 //非内联函数 } inline fun test(noinline inlined: () -> Unit) { fun test() {
} fun innerFun(a: () -> Unit) { fun test() {
} inline fun innerFun(a: () -> Unit) { fun test() {
} inline fun innerFun(crossinline a: () -> Unit) { inline fun startActivity() { startActivity() |
对比java kotlin优化 内联函数 用来解决 频繁调用某个函数导致的性能消耗 使用 inline标记 noinline,让原本的内联函数形参函数不是内联的,保留原有数据特征 crossinline reified 具体化泛型 使用内联标记的函数,这个函数的泛型,可以具体化展示,所有 能解决方法重复的问题 |
上面的老哥都讲的很好,但是大多数同学都用的是java,难免有些不友好,所以我用koltin+java字节码的方式,便于大家有一个概念(虽然暂时没有使用kotlin)。 public class Test {
public static void main(String[] args) {
System.out.println(sum(10)+sum(5));
}
private static int sum(int a){
int sum=8;
sum+=a;
return sum;
}
} 这是一段java代码,简单的不能再简单了吧,就是重复的相加,别注意逻辑,只是为了演示。 同样的kotlin代码: inline fun sum(a: Int): Int {
var sum = 8
sum += a
return sum
}
fun main() {
println(sum(10)+ sum(5))
} 虽然一眼看上去很简洁,但我们的关注点不在这里,在 inline 关键字上面。为了便于大家学习,我通过查看字节码的方式来转成相应的 java 代码,便于大家更好的理解。 没加 inline 之前 加上 inline 之后 解释就不用多说了吧,kotlin 自动帮我们将方法在编译期就加在了相应的调用处,免除了 java 中的入方法栈与退栈。 后面的有点看不太懂,所以还得再看看。 |
感觉上面部分还有一些不太合适,只说了它的使用和意义,并没有讨论
前段时间自己总结了一下,有兴趣可以看一下这个链接:https://www.jianshu.com/p/8a0d5bae9cdf |
浅显易懂,小弟看懂了 |
inline 还可以解决获取泛型的class问题: inline fun < refied T> String.json2Obj() : T{
return Gson().fromJson<T>(this, T::class.java)
} (代码可能有问题 |
需要加上实化关键字 refied: inline fun <refied T> String.json2Obj() : T{
return Gson().fromJson<T>(this, T::class.java)
} |
No description provided.
The text was updated successfully, but these errors were encountered: