将 lambda 表达式存储在变量中会消除内联优化

问题描述

我正在考虑使用内联函数优化调用堆栈的大小。

如果执行以下代码

inline fun function2( action: () -> Unit) {
 action()
}

fun function1() {

 function2{ printCurrentStack() }
}

fun printCurrentStack() {
 RuntimeException().printstacktrace()
}

fun main() {
 function1()
}

您将获得以下输出

at com.kotlin.playground.functional.PrimeNumbersKt.printCurrentStack(PrimeNumbers.kt:17)
at com.kotlin.playground.functional.PrimeNumbersKt$function1$1.invoke(PrimeNumbers.kt:13)
at com.kotlin.playground.functional.PrimeNumbersKt$function1$1.invoke(PrimeNumbers.kt)
at com.kotlin.playground.functional.PrimeNumbersKt.function2(PrimeNumbers.kt:8)
at com.kotlin.playground.functional.PrimeNumbersKt.function1(PrimeNumbers.kt:13)
at com.kotlin.playground.functional.PrimeNumbersKt.main(PrimeNumbers.kt:21)
at com.kotlin.playground.functional.PrimeNumbersKt.main(PrimeNumbers.kt)

因此,在这种情况下,堆栈有 7 个元素。

现在,如果我将 function2 标记为内联并执行代码,我会得到以下输出

at com.kotlin.playground.functional.PrimeNumbersKt.printCurrentStack(PrimeNumbers.kt:17)
at com.kotlin.playground.functional.PrimeNumbersKt.function1(PrimeNumbers.kt:13)
at com.kotlin.playground.functional.PrimeNumbersKt.main(PrimeNumbers.kt:21)
at com.kotlin.playground.functional.PrimeNumbersKt.main(PrimeNumbers.kt)

这看起来效果很好,调用堆栈的大小减少了 3。
但是,如果我更新 function1 以在将 lambda 发送到 function2 之前将其存储在变量中:

fun function1() {
 val lambda = { printCurrentStack() }
 function2(lambda)
}

输出更改为:

at com.kotlin.playground.functional.PrimeNumbersKt.printCurrentStack(PrimeNumbers.kt:15)
at com.kotlin.playground.functional.PrimeNumbersKt$function1$lambda$1.invoke(PrimeNumbers.kt:10)
at com.kotlin.playground.functional.PrimeNumbersKt$function1$lambda$1.invoke(PrimeNumbers.kt)
at com.kotlin.playground.functional.PrimeNumbersKt.function1(PrimeNumbers.kt:21)
at com.kotlin.playground.functional.PrimeNumbersKt.main(PrimeNumbers.kt:19)
at com.kotlin.playground.functional.PrimeNumbersKt.main(PrimeNumbers.kt)

尽管 function2 仍被标记inline 函数,但调用堆栈的大小从 4 变为 6。

如果将 lambda 存储在变量中,则似乎无法内联 lambda 调用
为什么会发生这种情况?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...