继上一篇文章给大家介绍完kotlin的扩展,这篇文章给大家讲讲kotlin中内联函数的用法。
什么是内联函数
内联函数:在程序编译时能将程序中内联函数的调用表达式直接替换成内联函数的函数体。关键字:inline
看一个例子:
fun test() { var x = 1 hello() print(x)}inline fun hello() { var a = 1 var b = 1 var c = a + b print(c)}
这是我们在编译器上编写看到的代码,而实际编译的时候会变成
fun test() { var x = 1 var a = 1 var b = 1 var c = a + b print(c) print(x)}
但实际上如果你这么写,你会发现编译器会给你一个警告提醒,大致意思是说不建议你在这里使用内联函数,可能得不到收益。原因下面解释。
为什么要使用内联函数
在讲这个问题之前,我们先来讲解几个概念1.高阶函数 高阶函数是将函数用作参数或返回值的函数。2.lambda 表达式 描述函数的一种简洁的方式所以我们经常会看到kotlin里面使用lambda表达式作为一个函数参数传递给其它函数。这个过程其实产生了很多隐性的开销。
-
lambda函数会被编译为函数对象(空间开销)
-
如果lambda函数的输入输出为原始数据类型,需要额外的装箱,拆箱操作
-
应用的方法总数会增加3-4个
-
在执行实际的函数调用时,增加了函数压栈出栈等调用的时间开销
而kotlin中的内联函数,很巧妙地解决了这一问题。我们只需要将高阶函数声明为内联,参数中的lambda函数也会自动变成内联。即可避免以上说到的开销,当然是以增加代码量的代价换取。所以可能的话,尽量将高阶函数声明为内联,保持代码行数为一个较小的数字,将大块代码移动到非内联函数中。
inline fun doCal(a: Int, b: Int, cal: (a: Int, b: Int) -> Int): Int { return cal(a, b)}
如果不希望lambda函数变成内联,可以使用noinline关键字:
inline fun doCal(a: Int, b: Int, noinline cal: (a: Int, b: Int) -> Int): Int { return cal(a, b)}
相信大家现在已经知道该什么时候使用内联函数了。