kotlin 内联函数 inline

打印 上一主题 下一主题

主题 996|帖子 996|积分 2988

高阶函数实现的原理:函数类型其实是天生了一个对象 。

inline翻译成中文的意思就是内联,在kotlin里面inline被用来修饰函数,表明当前函数在编译时是以内嵌的形式进行编译的,从而淘汰了一层函数调用栈:
  1. inline fun fun1() {
  2.     Log.i("tag", "1")
  3. }
  4. //调用
  5. fun mainFun() {
  6.     fun1()
  7. }
  8. //实际编译的代码
  9. fun mainFun() {
  10.     Log.i("tag", "1")
  11. }
复制代码
这样写的一点好处就是调用栈会显着变浅:
但是这个好处对应用程序的优化影响非常小,险些可以忽略不计。乃至大概会由于多处调用代码重复编译导致编译字节码膨胀从而造成包体积变大的问题,这就得不偿失。

我们都知道kotlin答应函数可以作为另一个函数的入参对象进行调用,在实际调用处入参的函数体会被创建为一个对象:

  1. fun fun1(doSomething: () -> Unit) {
  2.     Log.i("tag", "1")
  3.     doSomething()
  4. }
  5. //调用
  6. fun mainFun() {
  7.     fun1 {
  8.         Log.i("tag", "2")
  9.     }
  10. }
  11. //实际编译的代码
  12. fun mainFun() {
  13.     val f = object: Function0<Unit> {
  14.         override fun invoke() {
  15.             Log.i("tag", "2")
  16.         }
  17.     }
  18.     fun1(f)
  19. }
复制代码
一般情况下上图所示的调用逻辑并没有什么问题,创建一个小对象并不会对性能造成什么影响,但是如果我们将fun1放入for循环中呢:
  1. fun mainFun() {
  2.     for (i in 0..1000) {
  3.         fun1 {
  4.             Log.i("tag", "2")
  5.         }
  6.     }
  7. }
复制代码

在短时间内就会在mainFun函数中循环创建1000个f对象,这样应用进程的内存会瞬间飙升并造成某些性能上的严重问题,这就雷同于为什么不让在onDraw函数中创建局部对象。
而作为fun1函数的创建者,我们无法知道调用者会在什么场景以及时机去调用fun1函数,一旦出现上述重复创建大量函数对象的场景那么就会有严重的性能问题,而且这也是kotlin高阶函数的一个性能隐患。以是,基于这个问题kotlin提供了inline关键字来解决。

   inline关键字可以将函数体内部的代码内联到调用处,乃至还可以将函数体内部的内部的代码也内联过去,而这个内部的内部的指的就是函数内部的函数类型的参数:
  
  1. inline fun fun1(doSomething: () -> Unit) {    Log.i("tag", "1")    doSomething()} //调用fun mainFun() {
  2.     for (i in 0..1000) {
  3.         fun1 {
  4.             Log.i("tag", "2")
  5.         }
  6.     }
  7. } //实际编译的代码fun mainFun() {    for (i in 0..1000) {        Log.i("tag", "1")        Log.i("tag", "2")    }}
复制代码
这样就避免了函数类型的参数所造成的临时函数对象的创建,我们就可以在界面高频革新、大量循环的场景下放心调用fun1函数了。
扩展:

Kotlin的 noinline和crossinline关键字-CSDN博客
总结

总的来说,inline关键字让函数以内联的方式进行编译避免创建函数对象来处理kotlin高阶函数的自然性能缺陷。同时,之前的文章中提到的kotlin的泛型实化,也是利用了inline关键字可以内嵌函数代码的特性而衍生出来的全新功能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

反转基因福娃

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表