全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Kotlin 内联函数详解及实例

Kotlin 内联函数详解及实例

概述

在说内联函数之前,先说说函数的调用过程。

调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要恢复现场,并按原来保存地址继续执行。也就是通常说的压栈和出栈。因此,函数调用要有一定的时间和空间方面的开销。那么对于那些函数体代码不是很大,又频繁调用的函数来说,这个时间和空间的消耗会很大。

那怎么解决这个性能消耗问题呢,这个时候需要引入内联函数了。内联函数就是在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来直接进行替换。显然,这样就不会产生转去转回的问题,但是由于在编译时将函数体中的代码被替代到程序中,因此会增加目标程序代码量,进而增加空间开销,而在时间代销上不象函数调用时那么大,可见它是以目标代码的增加为代价来换取时间的节省。

inline

在Kotlin中,使用inline修饰符标记内联函数,既会影响到函数本身, 也影响到传递给它的Lambda表达式,这两者都会被内联到调用处。

例如:

inline fun lock<T>(lock: Lock, body: () -> T): T {
// ...
}

编译器可以直接产生下面的代码, 而不必为参数创建函数对象, 然后再调用这个参数指向的函数:

l.lock()
try {
  foo()
}
finally {
  l.unlock()
}

noinline

如果一个内联函数的参数中有多个 Lambda 表达式, 而你只希望内联其中的一部分, 你可以对函数的一部分参数添加 noinline 标记:

inline fun foo(inlined: () -> Unit, noinline notInlined: () -> Unit) {
  // ...
}

可内联的 Lambda 表达式只能在内联函数内部调用, 或者再作为可内联的参数传递给其他函数, 但noinline 的 Lambda 表达式可以按照我们喜欢的方式任意使用: 可以保存在域内, 也可以当作参数传递, 等等。

非局部返回(Non-local return)

在Kotlin中, 使用无限定符的通常的return语句, 只能用来退出一个有名称的函数, 或匿名函数. 这就意味着, 要退出一个Lambda表达式, 我们必须使用一个 标签, 无标签的 return 在 Lambda 表达式内是禁止使用的, 因为 Lambda 表达式不允许强制包含它的函数返回:

fun foo() {
  ordinaryFunction {
    return // 错误: 这里不允许让 `foo` 函数返回
  }
}

如果 Lambda 表达式被传递去的函数是内联函数, 那么 return 语句也可以内联, 因此 return 是允许的。

fun foo() {
  inlineFunction {
    return // OK: 这里的 Lambda 表达式是内联的
  }
}

注:

有些内联函数可能并不在自己的函数体内直接调用传递给它的 Lambda 表达式参数, 而是通过另一个执行环境来调用, 比如通过一个局部对象, 或者一个嵌套函数. 这种情况下, 在 Lambda 表达式内, 非局部的控制流同样是禁止的. 为了标识这一点, Lambda 表达式参数需要添加 crossinline修饰符。

inline fun f(crossinline body: () -> Unit) {
  val f = object: Runnable {
    override fun run() = body()
  }
  // ...
}


感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Kotlin  # 内联函数  # 内联函数详解  # 内联函数使用方法  # Kotlin扩展函数及实现机制的深入探索  # Kotlin基础教程之函数定义与变量声明  # Kotlin中的扩展函数与属性示例详解  # Kotlin中的sam(函数式接口)详解  # Kotlin中关于内联函数的一些理解分享  # Kotlin函数默认值的完全讲解  # Kotlin教程之函数和包的定义和流程控制  # Kotlin作用域函数之间的区别和使用场景详解  # 转去  # 影响到  # 自己的  # 多个  # 修饰符  # 要有  # 中有  # 而在  # 也可  # 能在  # 这就  # 希望能  # 然后再  # 可以直接  # 你可  # 这个时候  # 谢谢大家  # 那么大  # 我们必须  # 你只 


相关文章: 网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  建站之星如何开启自定义404页面避免用户流失?  购物网站制作公司有哪些,哪个购物网站比较好?  如何选择可靠的免备案建站服务器?  如何通过cPanel快速搭建网站?  如何在IIS中配置站点IP、端口及主机头?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  如何在阿里云域名上完成建站全流程?  C++时间戳转换成日期时间的步骤和示例代码  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  济南网站制作的价格,历城一职专官方网站?  实惠建站价格推荐:2025年高性价比自助建站套餐解析  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  济南企业网站制作公司,济南社保单位网上缴费步骤?  无锡营销型网站制作公司,无锡网选车牌流程?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  自助网站制作软件,个人如何自助建网站?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  c# await 一个已经完成的Task会发生什么  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  如何在IIS7上新建站点并设置安全权限?  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  用v-html解决Vue.js渲染中html标签不被解析的问题  ,购物网站怎么盈利呢?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  建站之星CMS五站合一模板配置与SEO优化指南  如何通过商城自助建站源码实现零基础高效建站?  如何在搬瓦工VPS快速搭建网站?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  如何注册花生壳免费域名并搭建个人网站?  建站之星导航菜单设置与功能模块配置全攻略  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  专业公司网站制作公司,用什么语言做企业网站比较好?  建站之星伪静态规则如何设置?  Python如何创建带属性的XML节点  h5网站制作工具有哪些,h5页面制作工具有哪些?  c# 在ASP.NET Core中管理和取消后台任务  h5在线制作网站电脑版下载,h5网页制作软件?  如何在云主机上快速搭建多站点网站?  如何快速打造个性化非模板自助建站?  如何快速搭建高效可靠的建站解决方案?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  网站按钮制作软件,如何实现网页中按钮的自动点击?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  平台云上自助建站如何快速打造专业网站?  ,怎么用自己头像做动态表情包?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。