void函数/属性调用在哪里执行?

时间:2019-02-23 01:43:26

标签: java kotlin compilation

这里的代码:

fun main(args: Array<String>){
    val items = listOf(1, 2, 3, 4)
    items.first() 
    items.last() 
    items.filter { it % 2 == 0 }  
}

我有一些扩展方法,例如first()last()-但它们没有做任何事情(未分配给任何变量)。这是否意味着编译器只是跳过它们而没有执行任何操作?

3 个答案:

答案 0 :(得分:2)

  

但是他们什么也没做(没有分配给任何变量)

据编译器所知,它们可能会有副作用(例如,打印某些内容或设置字段),在这种情况下,必须执行它们。如果它们是inline,则内联后,编译器可能会消除它们,如Josh的回答所述。但是它们并非如此,因此编译器不能依赖其 definitions (与签名相反):在运行时,可能存在一个包含这些方法并带有副作用的不同JAR。 / p>

但是JIT很可能会内联它们,如果运行足够的时间,则可以消除它们;只是不是立即。

原则上,可以contracts声明这些方法为纯方法,然后编译器可以消除它们。但是据我所知,目前的合同并不支持这一点。

答案 1 :(得分:1)

之所以调用方法是因为您调用了它,但是您没有存储在引用变量中的结果,如果我没记错(立即符合垃圾回收条件)但仍没有变量,它仍会在堆上创建链接到它的参考。

答案 2 :(得分:0)

您所指的是消除无效代码。 Here是一篇相关的文章,它解决了一个类似的问题。