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

kotlin如何优化该数字所属范围的检查?,kotlin,Kotlin,我正在调查kotlin使用java代码的反编译 我发现了一个有趣的细微差别,无法理解它是如何实现的 以下是kotlin代码: val result = 50 in 1..100 我正在使用intelij idea反编译来寻找java代码的等价物,下面是我们所拥有的: public final class Test14Kt { private static final boolean result = true; public static final boolean getRes

我正在调查kotlin使用java代码的反编译

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

以下是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保存为result变量

很酷。但它是如何实现的

这很简单:

常量表达式中的项通常是简单的文本,例如整数文本2,但它们也可能是编译时已知其值的变量。考虑以下陈述:

i = 320 * 200 * 32;
大多数现代编译器实际上不会为该语句生成两条乘法指令和一个存储。相反,它们标识这样的构造,并在编译时替换计算值(在本例中为2048000)。生成的代码将加载并存储计算值,而不是加载并乘以多个值

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

这里,

50英寸1..100==
1这很简单:

常量表达式中的项通常是简单的文本,例如整数文本2,但它们也可能是编译时已知其值的变量。考虑以下陈述:

i = 320 * 200 * 32;
大多数现代编译器实际上不会为该语句生成两条乘法指令和一个存储。相反,它们标识这样的构造,并在编译时替换计算值(在本例中为2048000)。生成的代码将加载并存储计算值,而不是加载并乘以多个值

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

这里,

50英寸1..100==

谢谢你,亚历克斯。现在清楚了。我只是很惊讶这种形式的折叠可以应用于复杂的类型,例如范围……嗯,
in.
只是根据定义转换为两个比较,范围甚至从未出现过。当然,编译器实际上可以创建范围并在其上调用
contains
方法,但在中构建它既简单又大获成功。加上Kotlin开发人员有Scala的示例,它坚持不这样做,并且它如何影响性能。所以在Scala中没有这样的优化?至少在我上次听说时,没有,谢谢,亚历克斯。现在清楚了。我只是很惊讶这种形式的折叠可以应用于复杂的类型,例如范围……嗯,
in.
只是根据定义转换为两个比较,范围甚至从未出现过。当然,编译器实际上可以创建范围并在其上调用
contains
方法,但在中构建它既简单又大获成功。加上Kotlin开发人员有Scala的示例,它坚持不这样做,并且它如何影响性能。所以在Scala中没有这样的优化?至少我上次听说时没有。