Kotlin 是否保证范围检查不会实例化范围?

Mar*_*nik 4 android kotlin

在我的 Android 应用程序中,我写道

return x >= rangeStart && x <= rangeEnd
Run Code Online (Sandbox Code Playgroud)

IntelliJ 进行了一项检查,希望我将其更改为

return x in rangeStart..rangeEnd
Run Code Online (Sandbox Code Playgroud)

但是,由于此代码位于高容量事件处理的关键路径上,因此只有当我确定第二种形式不会产生任何垃圾时,我才能接受转换。Kotlin 有这样的保证吗?

zsm*_*b13 5

您可以通过搜索操作并输入“显示 Kotlin 字节码”或通过工具 -> Kotlin -> 显示 Kotlin 字节码从菜单中自己检查 Kotlin 编译器生成的字节码。

优化对原语(Int、Double 等)的范围检查是一件非常简单的事情,因此您会发现 Kotlin 编译器总是为您对这些类型进行优化。如果您的关键代码路径上只有其中的几个,您可以手动检查它是否发生,以确保使用范围是安全的。

文件是关于这短暂的,但它确实说:

Range 是为任何可比较的类型定义的,但对于完整的原始类型,它有一个优化的实现。