Kotlin 源码里成吨的 noinline 和 crossinline 是干嘛的?看完这个视频你转头也写了一吨...

本文详细介绍了Kotlin中inline、noinline和crossinline这三个关键字的用法和原理。inline用于函数内联优化,减少函数对象的创建,但可能导致代码膨胀。noinline用于在内联函数中防止特定参数被内联,以允许其作为对象使用。crossinline则允许内联函数的Lambda参数在间接调用时使用,但会牺牲return的灵活性。这些关键字在优化高阶函数和处理Lambda表达式时起到关键作用。
摘要由CSDN通过智能技术生成

视频先行

扫码看视频吧!
然后下面的就不用看了
或者……你喜欢看文字?

Kotlin 里有个特别好用的关键字叫 inline,它可以帮你对做了标记的函数进行内联优化。所谓内联就是,调用的函数在编译的时候会变成代码内嵌的形式:

这样的好处很明显,调用栈变浅了嘛,对吧?

不过事实上这种对调用栈的优化的效果非常小,小到了应该被忽略的程度。是应该被忽略,不是可以被忽略,因为这种优化不仅没啥用,而且还可能因为代码多处拷贝而导致编译生成的字节码膨胀,从而变成负优化。所以,这种东西我们要它干嘛呢?

——哎?那我讲个屁呀?

正文在这里

大家好,我是扔物线朱凯。

Java 里有个概念叫编译时常量 Compile-time Constant,直观地讲就是这个变量的值是固定不变的,并且编译器在编译的时候就能确定这个变量的值。具体到代码上,就是这个变量需要是 final 的,类型只能是字符串或者基本类型,而且这个变量需要在声明的时候就赋值,等号右边还不能太复杂。总之就是你得让编译器一眼瞟过去就能看出结果。这种编译时常量,会被编译器以内联的形式进行编译,也就是直接把你的值拿过去替换掉调用处的变量名来编译。这样一来,程序结构就变简单了,编译器和 JVM 也方便做各种优化。这,就是编译时常量的作用。

这种编译时常量,到了 Kotlin 里有了一个专有的关键字,叫 const:一个变量如果以 const val 开头,它就会被编译器当做编译时常量来进行内联式编译:

——当然你得符合编译时常量的特征啊,不然会报错,不给编。

inline

让变量内联用的是 const;而除了变量,Kotlin 还增加了对函数进行内联的支持。在 Kotlin 里,你给一个函数加上 inline 关键字,这个函数就会被以内联的方式进行编译。但!虽然同为内联,inline 关键字的作用和目的跟 const 是完全不同的。

编译时常量为什么这么多限制?因为只有符合这些限制,编译器和 JVM 才有能力做优化,从而这种内联操作也才有意义。稍微复杂一点,就优化不动了。什么叫「稍微复杂」我不知道,但是函数内联这种操作,绝对算得上是相当复杂了,绝对优化不动的。其实真要较真起来,函数的内联确实会产生一种被动的优化,就是刚才我说的:去掉一个函数,调用栈少了一层,性能的损耗肯定会少一些,但实际上调用栈本身所造成的性能损耗本来就是非常小的,这个优化跟没优化差不多。这个事实可能不太符合我们的直觉,但你这样想一下:在我们看到的各种性能优化规范里,你有没有见过类似「少写几个方法来减少调用栈」这样的优化策略?没有吧?为什么?因为这种优化没有意义。而同时,函数内联不同于常量内联的地方在于,函数体通常比常量复杂多了,而函数内联会导致函数体被拷贝到每个调用处,如果函数体比较大而被调用处又比较多,就会导致编译出的字节码变大很多。我们都知道编译结果的压缩是应用优化的一大指标,而函数内联对于这项指标是明显不利的。所以靠 inline 来做性能优化?不存在的。

那么问题就来了:inli

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误通常表示在绑定(binding)过程中,类 `org.jetbrains.kotlin.idea.highlighter.KotlinDefaultHighlightingSettingsProvider` 没有可访问的访问器(accessor)。 绑定是指将 XML 数据绑定到 Java 类的过程。在 IntelliJ IDEA 中,XML 序列化和反序列化使用的是 XML 库和注解。但是,如果类缺少适当的访问器方法,绑定过程就会失败。 要解决这个错误,你可以尝试以下几个步骤: 1. 确认类的访问器方法存在:检查 `KotlinDefaultHighlightingSettingsProvider` 类中是否存在公共的访问器方法(getter 和 setter)。确保这些方法符合 JavaBean 规范,并且名称和类型与对应的属性匹配。 2. 检查类的注解配置:确保 `KotlinDefaultHighlightingSettingsProvider` 类上的注解配置正确,并且与绑定过程的期望结果一致。特别是,检查是否存在与 XML 元素名称对应的注解。 3. 更新或修复插件:如果你遇到这个错误是因为 IntelliJ IDEA 或 Kotlin 插件的问题,尝试更新或重新安装相关插件版本。有时候,插件更新可以修复已知的问题或缺陷。 4. 向开发者报告问题:如果以上步骤都无法解决问题,你可以向 IntelliJ IDEA 或 Kotlin 插件的开发者报告该问题。他们可能会提供更详细的指导或修复。 需要注意的是,这个错误可能是由于插件或框架的问题引起的,因此你可能无法直接解决它。在这种情况下,寻求插件或框架的开发者支持可能是解决问题的最佳途径。 希望这些提示能够帮助你解决问题,如果你有任何其他疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值