kotlin 编译器可以优化类使其“内联”吗?

3z6pesqy  于 2022-12-23  发布在  Kotlin
关注(0)|答案(1)|浏览(169)

一些编程语言使用inline或其他关键字来手动指定要替换为被调用函数体的函数调用位置。
例如,C#就没有这样的功能,因为编译器会自动决定哪些代码被内联,在我看来,这避免了污染开发人员的体验(开发人员不应该担心优化)。
一些语言实现了inline类的语法,如Kotlin和现在的Dart,它们将现有类型 Package 成新的静态类型,减少了传统类的开销。
Dart声明示例(已指定,尚未实现):

inline class Foo {
  // A single instance variable, defining the representation type.
  final Bar bar;
  
  // The desired set of other members.
  void function1() {
     bar.baz; 
  }
  ...
}

我的问题是,编译器能在类中自动进行这种优化吗?如果不能,是什么挑战使这变得困难/不可能?

l0oc07j2

l0oc07j21#

这不仅仅是优化的问题,有些内联可能会降低代码的性能和/或使代码变得更大,所以Kotlin给了你控制权(IntelliJ在某些情况下警告不要内联--警告你内联不会提高性能)。
不仅如此,您还应该阅读Reified Type Parameters-它允许使用某些编码技术,这些技术只有在函数和类型信息被内联时才有可能。
下面是一些在Java中不可能实现的代码:
假设你有一系列的枚举,代表一个对象的状态,例如:

enum class Color {RED,BLUE,GREEN}
enum class Size {SMALL,MEDIUM,LARGE}
data class MyObject(val color: Color, val size:Size)

并且您有一个测试数据生成器,它使用Random数生成器为Object挑选一个随机枚举。
在Kotlin中,您可以写:

val rnd = Random(1)
val x = MyObject(
    color = getRandomEnum(rnd),
    size = getRandomEnum(rnd),
)

用这个

private inline fun <reified T : Enum<T>> getRandomEnum(rnd: Random): T {
    val values: Array<T> = enumValues()
    return values.get(rnd.nextInt(values.size))
}

相关问题