kotlin 内联函数 inline

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

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.rhkb.cn/news/38575.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(二)VMware:VMware虚拟机安装CentOS教程

目录 1、准备CentOS 7镜像1.1、官网镜像下载1.2、清华大学开源镜像下载​1.3、阿里云开源镜像下载 2、使用 VMware安装CentOS 72.1、创建虚拟机2.2、选择自定义安装2.3、硬件兼容性&#xff0c;保持默认2.4、选择下载的ISO镜像2.5、设置虚拟机名称以及存放磁盘位置2.6、按照需求…

哈尔滨工业大学DeepSeek公开课人工智能:从图灵测试到DeepSeek|附视频和PPT下载方法

导 读 INTRODUCTION 今天给大家分享一份哈尔滨工业大学发布的《从图灵测试到DeepSeek》&#xff0c;由哈尔滨工业大学人工智能学院执行院长兼计算学部副主任张伟男教授带你穿越AI发展简史&#xff0c;解锁从图灵测试的奠基性思想到DeepSeek大模型的技术突破&#xff0c;带你领…

【算法笔记】图论基础(一):建图、存图、树和图的遍历、拓扑排序、最小生成树

目录 何为图论图的概念 图的一些基本概念有向图和无向图带权图连通图和非连通图对于无向图对于有向图 度对于无向图对于有向图一些结论 环自环、重边、简单图、完全图自环重边简单图 稀疏图和稠密图子图、生成子图同构 图的存储直接存边邻接矩阵存边邻接表存边链式前向星存边 图…

vue 对接 paypal 订阅和支付

一个是支付一个是订阅&#xff0c;写的时候尝试把他们放到一个里面&#xff0c;但是会报错&#xff0c;所以分开写了 我们的页面&#xff0c;前三个为订阅最后一个是支付&#xff0c;我把他们放到一个数组里面循环展示的&#xff0c;所以我们判断的时候只要判断id是否为4&#…

(四)---四元数的基础知识-(定义)-(乘法)-(逆)-(退化到二维复平面)-(四元数乘法的导数)

使用四元数的原因 最重要的原因是因为传感器的角速度计得到的是三个轴的角速度, 这三个轴的角速度合成一个角速度矢量, 结果就是在微小时间内绕着这个角速度矢量方向为轴旋转一定角度. 截图来源网址四元数 | Crazepony开源四轴飞行器

Android10 系统截屏功能异常的处理

客户反馈的问题&#xff0c;设备上使用状态栏中“长截屏”功能&#xff0c;截屏失败且出现系统卡死问题。 在此记录该问题的处理 一现象&#xff1a; 设备A10上使用系统“长截屏”功能&#xff0c;出现截屏失败&#xff0c;系统死机。 二复现问题并分析 使用设备操作该功能&…

工业软件的破局与重构:从技术依赖到自主创新的未来路径

工业软件作为现代工业的“神经与大脑”&#xff0c;不仅是制造业数字化转型的核心工具&#xff0c;更是国家工业竞争力的战略制高点。近年来&#xff0c;中国工业软件市场在政策驱动与技术迭代中迅猛发展&#xff0c;但核心技术受制于人的困境仍待突破。如何实现从“跟跑”到“…

Git基础

一、git概述 git简介 什么是Git? Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件(Java类、ml文件、html页面等)。通过Gt仓库来存储和管理这些文件&#xff0c;Git仓库分为两种&#xff1a; ●本地仓库&#xff1a;开发人员自己电脑上的Git仓库…

Idea中使用Git插件_合并当前分支到master分支_冲突解决_很简单---Git工作笔记005

由于之前用svn习惯了,用的git少,其实在idea中使用git,解决冲突,合并分支,非常的简单,一起来看一下吧. 一定要注意操作之前,一定要确保自己的分支代码,都已经commit提交了,并且push到远程了. 不要丢东西. 可以看到首先,在idea的左下角有个 git,点开以后 可以看到有显示的分支…

大数据学习栈记——HBase操作(shell java)

本文介绍HBase在shell终端的常见操作以及如何利用java api操作HBase&#xff0c;操作系统&#xff1a;Ubuntu24.04 参考&#xff1a; https://blog.51cto.com/u_16099228/8016429 https://blog.csdn.net/m0_37739193/article/details/73618899 https://cloud.tencent.com/d…

【DETR】训练自己的数据集以及YOLO数据集格式(txt)转化成COCO格式(json)

目录 1.DETR介绍2.数据集处理3.转化结果可视化4.数据集训练4.1修改pth文件4.2类别参数修改4.3训练 5.成功运行&#xff01;6.参考文献 1.DETR介绍 DETR(Detection with TRansformers)是基于transformer的端对端目标检测&#xff0c;无NMS后处理步骤&#xff0c;无anchor。 代码…

HashMap学习总结——JDK17

文章目录 HashMap构造方法HashMap(int initialCapacity, float loadFactor)loadFactor 加载因子initialCapacity 初始容量tableSizeFor(int cap) 计算前导零 HashMap(Map<? extends K, ? extends V> m) put(K key, V value)hash(Object key) 求hash值putVal(int hash, …

Linux:进程信号

✨✨所属专栏&#xff1a;Linux✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ Linux&#xff1a;进程信号 在讲信号之前&#xff0c;我们先来从生活中的事情来确定信号的一些特性。 我在网上买了商品&#xff0c;我在等快递。但是在快递没来之前我知道快递来的时候我应该怎么处理。…

c#知识点补充2

1.非静态类能否调用静态方法可以 2.对string类型扩展方法&#xff0c;如何进行 类用静态类&#xff0c;参数是this 调用如下 3.out的用法 一定要给a赋值 这种写法不行 这样才行 4.匿名类 5.委托的使用 无论是匿名委托&#xff0c;还是具命委托&#xff0c;委托实例化后一定要…

0322-数据库、前后端

前端 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Insert title here</title> <script srcjs/jquery-3.7.1.min.js></script> <script> //jquaryajax发起请求 //传参形式不同 post用data{}…

Spring Boot02(数据库、Redis)02---java八股

MySQL和Redis的区别&#xff1f; 1. 数据类型&#xff1a; MySQL是一种关系型数据库&#xff0c;表结构化存储&#xff0c;使用 SQL 查询。支持表、列、行等结构化数据。 Redis是一种基于内存的缓存系统&#xff0c;支持多种数据结构&#xff0c;如字符串、哈希表、列表、集合、…

VulnHub-Web-Machine-N7通关攻略

一、信息收集 第一步&#xff1a;确定靶机IP为192.168.0.107 第二步&#xff1a;扫描后台及开放端口 第三步&#xff1a;进行敏感目录及文件扫描 http://192.168.0.107/index.html (CODE:200|SIZE:1620) http://192.168.0.107/server-status (CODE:403|SIZ…

【AI News | 20250322】每日AI进展

AI Repos 1、DeTikZify 可以把草图或图形转换成TikZ代码的模型&#xff0c;可用来绘制复杂的科学图表&#xff0c;输入草图或文字描述即可转换成TikZ代码。DeTikZify强大的地方在于它能理解图表的语义信息&#xff0c; 能识别图表中的不同组成部分及其含义&#xff0c;比如坐标…

三主热备架构

1.要求 角色主机名软件IP地址用户client192.168.72.90keepalivedvip192.168.72.100masterserverAkeepalived, nginx192.168.72.30backupserverBkeepalived, nginx192.168.72.31backupserverCkeepalived, nginx192.168.72.32webtomcat1tomcat192.168.72.41webtomcat2tomcat192.1…

LiteratureReading:[2023] GPT-4: Technical Report

文章目录 一、文献简明&#xff08;zero&#xff09;二、快速预览&#xff08;first&#xff09;1、标题分析2、作者介绍3、引用数4、摘要分析&#xff08;1&#xff09;翻译&#xff08;2&#xff09;分析 5、总结分析&#xff08;1&#xff09;翻译&#xff08;2&#xff09;…