这里的代码:
fun main(args: Array<String>){
val items = listOf(1, 2, 3, 4)
items.first()
items.last()
items.filter { it % 2 == 0 }
}
我有一些扩展方法,例如first()
和last()
-但它们没有做任何事情(未分配给任何变量)。这是否意味着编译器只是跳过它们而没有执行任何操作?
答案 0 :(得分:2)
但是他们什么也没做(没有分配给任何变量)
据编译器所知,它们可能会有副作用(例如,打印某些内容或设置字段),在这种情况下,必须执行它们。如果它们是inline
,则内联后,编译器可能会消除它们,如Josh的回答所述。但是它们并非如此,因此编译器不能依赖其 definitions (与签名相反):在运行时,可能存在一个包含这些方法并带有副作用的不同JAR。 / p>
但是JIT很可能会内联它们,如果运行足够的时间,则可以消除它们;只是不是立即。
原则上,可以contracts声明这些方法为纯方法,然后编译器可以消除它们。但是据我所知,目前的合同并不支持这一点。
答案 1 :(得分:1)
之所以调用方法是因为您调用了它,但是您没有存储在引用变量中的结果,如果我没记错(立即符合垃圾回收条件)但仍没有变量,它仍会在堆上创建链接到它的参考。
答案 2 :(得分:0)
您所指的是消除无效代码。 Here是一篇相关的文章,它解决了一个类似的问题。