@foonfyrick

Function вызов inline и константы?

Читаю с сайта:
Функция может быть легко встроена в то место, из которого она вызывается с помощью модификатора inline.
Модификатор inline влияет и на функцию, и на лямбду, переданную ей: они обе будут встроены в место вызова.

Читаю ответ на мой прошлый вопрос про const val и val:
После компиляции они исчезают(в байткоде их нет) и подставляются на место использования.

Мой вывод: Получается что, принцип константы и inline модификатора схож? Константа присваивается во время компиляции и не может быть присвоена во время выполнения кода, так и inline модификатор, подставляет функцию во время компиляции, эта функция не может использоваться во время выполнения кода? Правильно?
  • Вопрос задан
  • 116 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Kotlin
Android developer at Yandex
На каком-то бытовом уровне схоже, конечно. Типа, и то, и другое встраивается. Но различия, конечно есть.
Есть ситуации, когда компилятор обязан встроить inline функцию, потому что другого ему не позволит JVM, например:
inline fun <reified T> f() {
    print(T::class.java.name)
}

reified дженерики поддерживаются только для inline функций, потому что в JVM на этапе выполнения никаких дженериков нет, и поэтому данную функцию можно использовать только с известным на момент компиляции типом. Тело функции встроится в место вызова и всё хорошо.

А вот если у тебя просто inline fun, вне зависимости от того, есть ли у неё функциональный параметр, то уже возможны варианты. При обычном вызове тело функции будет встроено, и на этом основаны всякие экстешны, они не просаживают произволительность. Но также ты можешь взять и передать эту функцию в другую в качестве параметра, и в этом случае ей просто некуда встраиваться:
inline fun f() { ... }
fun g(p: ()-> Unit) {
    p()
}

fun main() {
    f() // заинлайнена
    g(::f) // не заинлайнена
}


Если хочешь разобраться - смотри декомпилированный байткод, там всё есть. Ещё почитай про модификаторы noinline, crossinline.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы