Где выполняются вызовы функций / свойств void? - PullRequest
0 голосов
/ 23 февраля 2019

Вот код:

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 голосов
/ 23 февраля 2019

Методы вызываются потому, что вы вызвали их, но результаты, которые вы не сохранили в ссылочной переменной, все равно будут созданы в куче, если я не ошибаюсь (сразу подходит для сборки мусора), но без переменнойссылка связана с ним.

0 голосов
/ 23 февраля 2019

но они ничего не делают (не присваиваются какой-либо переменной)

Насколько знает компилятор, у них могут быть побочные эффекты (например, печать чего-либоили установка поля) и в этом случае они должны быть выполнены.Если бы они были inline, компилятор мог бы исключить их, как упоминает ответ Джоша, после вставки.Но это не так, поэтому компилятор не может полагаться на свои определения (в отличие от сигнатур): во время выполнения может существовать другой JAR, содержащий эти методы и определяющий их с побочными эффектами.

Но JIT, скорее всего, встроит их, а затем устранит, если вы запустите этот код достаточно времени;просто не сразу.

В принципе могут быть контракты , объявляющие эти методы чистыми, и тогда компилятор может их устранить.Но текущие контракты не поддерживают это, насколько я знаю.

0 голосов
/ 23 февраля 2019

То, на что вы ссылаетесь, называется устранением мертвого кода. Здесь - это пост, связанный с похожим вопросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...