Kotlin 内在的“areEqual”方法的目的是什么?

Use*_*291 2 compiler-construction language-design kotlin

假设我有一个

data class Eq(x: Int?)
Run Code Online (Sandbox Code Playgroud)

这将生成一个equals看起来像这样的方法

public boolean equals(Object other){
    if(this == other) return true;
    if(!(other instanceof Eq)) return false;
    Eq otherEq = (Eq) other;
    return Intrinsics.areEqual(this.x, otherEq.x);
}
Run Code Online (Sandbox Code Playgroud)

内在的

public static boolean areEqual(Object first, Object second){
    return first == null ? second == null : first.equals(second);
}
Run Code Online (Sandbox Code Playgroud)

我不太明白这背后的动机。

保持静态调用而不是内联其实现有什么好处?

hot*_*key 5

保持内在方法作为静态方法而不是在每个使用站点内联它有几个优点:

  • 它不会炸毁生成的二进制文件。对于大多数内在函数,字节码中的方法调用比内联体要小。因此,内联内联会导致生成的二进制文件大小的增长。

  • 内在实现在语言演变过程中处于控制之下,并且在所有调用站点中保持一致。由于内在函数被保留为一种方法,较新的运行时库可能会提供更好的实现,可以一次应用于所有调用站点,而不是内联不同版本的不同二进制文件。

至于为了性能而在编译时内联,在JVM世界中,这通常是不可行的。JVM 字节码是一个相当高级的抽象(堆栈机器代码,与真正的硬件相去甚远),并且 JVM 本身擅长在 JIT 编译期间内联方法调用,因此编译器通常不运行微优化并依赖于 JVM 实现中内置的优化。