kotlin如何优化数字属于范围的检查?

时间:2018-04-11 10:17:03

标签: kotlin

我正在使用反编译到java代码来研究kotlin。

我发现了一个有趣的细微差别,无法理解它是如何实现的。

这是kotlin代码:

val result = 50 in 1..100

我正在使用intelij idea反编译来查找java代码的等价物,这就是我们所拥有的:

public final class Test14Kt {
   private static final boolean result = true;

   public static final boolean getResult() {
      return result;
   }
}

据我所知,kotlinc知道该元素在范围内并在编译阶段将结果变量保存为true。

很酷。但它是如何实现的?

1 个答案:

答案 0 :(得分:4)

这很简单constant folding

  

常量表达式中的术语通常是简单的文字,例如整数文字2,但它们也可能是在编译时已知其值的变量。请考虑以下声明:

i = 320 * 200 * 32;
     

大多数现代编译器实际上不会为此语句生成两个乘法指令和存储。相反,它们识别这些构造,并在编译时替换计算值(在本例中为2,048,000)。生成的代码将加载计算值并存储它,而不是加载和乘以多个值。

     

常量折叠甚至可以使用算术标识。当x是整数类型时,即使编译器不知道x的值,0 * x的值也为零。

在这里,

50 in 1..100 == 
1 <= 50 && 50 <= 100 == 
true && true == 
true