kotlin 内联函数 inline

embedded/2025/3/25 21:04:17/

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

inline翻译成中文的意思就是内联,在kotlin里面inline被用来修饰函数,表明当前函数在编译时是以内嵌的形式进行编译的,从而减少了一层函数调用栈:

inline fun fun1() {Log.i("tag", "1")
}//调用
fun mainFun() {fun1()
}//实际编译的代码
fun mainFun() {Log.i("tag", "1")
}

这样写的一点好处就是调用栈会明显变浅:

但是这个好处对应用程序的优化影响非常小,几乎可以忽略不计。甚至可能会由于多处调用代码重复编译导致编译字节码膨胀从而造成包体积变大的问题,这就得不偿失。

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

fun fun1(doSomething: () -> Unit) {Log.i("tag", "1")doSomething()
}//调用
fun mainFun() {fun1 {Log.i("tag", "2")}
}//实际编译的代码
fun mainFun() {val f = object: Function0<Unit> {override fun invoke() {Log.i("tag", "2")}}fun1(f)
}

一般情况下上图所示的调用逻辑并没有什么问题,创建一个小对象并不会对性能造成什么影响,但是如果我们将fun1放入for循环中呢:

fun mainFun() {for (i in 0..1000) {fun1 {Log.i("tag", "2")}}
}

在短时间内就会在mainFun函数中循环创建1000个f对象,这样应用进程的内存会瞬间飙升并造成某些性能上的严重问题,这就类似于为什么不让在onDraw函数中创建局部对象。

而作为fun1函数的创建者,我们无法知道调用者会在什么场景以及时机去调用fun1函数,一旦出现上述重复创建大量函数对象的场景那么就会有严重的性能问题,而且这也是kotlin高阶函数的一个性能隐患。所以,基于这个问题kotlin提供了inline关键字来解决。

inline关键字可以将函数体内部的代码内联到调用处,甚至还可以将函数体内部的内部的代码也内联过去,而这个内部的内部的指的就是函数内部的函数类型的参数:

inline fun fun1(doSomething: () -> Unit) {Log.i("tag", "1")doSomething()
}//调用
fun mainFun() {for (i in 0..1000) {fun1 {Log.i("tag", "2")}}
}//实际编译的代码
fun mainFun() {for (i in 0..1000) {Log.i("tag", "1")Log.i("tag", "2")}
}

这样就避免了函数类型的参数所造成的临时函数对象的创建,我们就可以在界面高频刷新、大量循环的场景下放心调用fun1函数了。

扩展:

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

总结

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


http://www.ppmy.cn/embedded/174631.html

相关文章

手机电脑如何通过跨平台远程控制工具来实现无缝互联

在如今数字化办公和生活的场景里&#xff0c;远程控制工具已经成了连接各种设备的关键桥梁。不管是跨系统协作、远程技术支持&#xff0c;还是让移动端和电脑端高效联动&#xff0c;用户对这些工具的要求早就从“能用就行”变成了“得用得顺手”。 接下来&#xff0c;我就从跨平…

Python 在自然语言处理(NLP)领域的应用场景和技术实现方式

Python 在自然语言处理&#xff08;NLP&#xff09;领域拥有丰富的应用场景和技术实现方式&#xff0c;涵盖从基础文本处理到复杂的深度学习模型构建。以下是基于搜索结果的详细分类总结&#xff1a; 一、基础文本处理任务 文本预处理 功能&#xff1a;清洗噪音&#xff08;如H…

LabVIEW运动控制(二):EtherCAT运动控制器的多轴示教加工应用(下)

前面两节课程分别给大家介绍了“控制器连接、定时获取轴状态、轴坐标、控制器型号、轴参数设置、IO控制、Basic文件下载”&#xff08;详情点击→LabVIEW运动控制&#xff08;二&#xff09;&#xff1a;EtherCAT运动控制器的多轴示教加工应用&#xff08;上&#xff09;&#…

存储过程在高并发环境下的重要性

在高并发系统中&#xff0c;数据库的性能和稳定性至关重要。随着系统并发请求的增加&#xff0c;SQL 语句的执行效率、事务管理以及锁机制的优化成为核心问题。存储过程&#xff08;Stored Procedure&#xff09;作为数据库内部的执行逻辑&#xff0c;能够有效提升高并发环境下…

在 ARM 嵌入式 Linux 下使用 C/C++ 实现 MQTT

在 ARM 嵌入式 Linux 下使用 C/C 实现 MQTT 通信是一个常见的需求&#xff0c;尤其是在资源受限的环境中。以下是一个详细的教程&#xff0c;使用 Eclipse Paho C Client 库来实现 MQTT 客户端。 1. 安装 Eclipse Paho C Client 库 Eclipse Paho C Client 是一个轻量级的 MQTT…

鸿蒙 元服务摘要

元服务&#xff08;原名原子化服务&#xff09;&#xff0c;是HarmonyOS提供的一种面向未来的服务提供方式&#xff0c;是有独立入口的&#xff08;用户可通过点击方式直接触发&#xff09;、免安装的&#xff08;无需显式安装&#xff0c;由系统程序框架后台安装后即可使用&am…

跟着StatQuest学知识03-反向传播

一、反向传播基本原理&#xff08;b3&#xff09; 反向传播要点&#xff1a;当我们不确定像b3这样的参数时&#xff0c;我们使用链式法则计算残差平方和关于b3的导数&#xff0c;然后将b3从一个初始值开始&#xff0c;通过梯度下降法来调整参数&#xff0c;进而得出最佳值。 因…

【c++】异常处理

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C 目录 前言 一、什么是异常 二、异常的使用 三、catch语句匹配的特例 四、异常的重新抛出 五、异常安全问题 六、异常规范 七、标准库异常体系 总结 前…