Kotlin如何优化数值范围归属检查?反编译Java代码存疑
关于Kotlin编译期常量折叠优化的实现逻辑
嘿,这个细节确实挺有意思的!你看到的其实是Kotlin编译器的**编译期常量折叠(Constant Folding)**优化,具体实现逻辑可以拆解成这几步:
识别编译期常量表达式
Kotlin编译器会先扫描表达式里的所有元素,判断它们是不是「编译期可确定的常量」。这里50、1、100都是字面量常量,1..100创建的IntRange因为边界都是常量,所以整个Range的范围在编译时就完全确定了。编译期直接求值
对于in操作符,本质上是调用Range.contains()方法,也就是执行值 >= 范围起始值 && 值 <= 范围结束值的判断。因为所有参与计算的值都是常量,编译器可以直接在编译阶段完成这个判断,得到确定的结果true。替换表达式为常量结果
编译器会把原来的50 in 1..100表达式直接替换成计算好的常量值,生成的字节码里就直接存储了true。所以当你用IntelliJ IDEA反编译时,看到的就是直接赋值的常量字段,而不是运行时才会执行的范围检查逻辑。
补充说明:如果表达式里包含任何非编译期常量的元素(比如把50换成一个需要运行时才能确定值的变量),编译器就不会触发这个优化,会生成常规的运行时范围检查代码,反编译后就能看到调用IntRange.contains()的完整逻辑了。
内容的提问来源于stack exchange,提问作者the_kaba
相关产品推荐
相关产品推荐

