Kotlin 中的局部变量和函数每次调用函数时都会重新创建吗?

问题描述 投票:0回答:1

考虑这段代码:

class Foo {
    fun bar() {
        val localVariable = 1

        fun localFunction() {
            // ...
        }

        // Rest of the code
    }
}

每次我调用

bar()
时,
localVariable
会被“重新创建”并且
localFuncion()
会被“重新定义”吗?基本上,如果我知道我会多次调用
bar()
,那么将它们都放在类作用域而不是本地作用域中,性能会更好吗?
我假设由于
localVariable
val
(最终),如果可能的话,它的值可能会被内联,否则会在编译器对
bar()
的调用之间缓存。这是真的吗?

performance kotlin memory scope
1个回答
0
投票

在 Kotlin/JVM 上,本地函数将被编译为封闭类的方法,就像常规实例方法一样。局部函数捕获的局部变量将作为参数传递。所以在编译后的二进制文件中,编写本地函数和编写实例方法没有太大区别。

每次调用封闭函数时,

局部变量do都会运行其初始化程序。对于

localVariable
,这只是两个字节码指令 - 推送常量 1 (
iconst
) 并将其存储在
localVariable
(
istore
) 中。我不会担心这里的性能。

如果变量初始化程序很耗时,那么您可能希望将其编写为实例属性,假设这不会改变

bar
的正确性。每次创建该类的新实例时,都会运行实例属性的初始化程序。

编译器是否内联

val
是编译器的实现细节。没有任何保证。

© www.soinside.com 2019 - 2024. All rights reserved.