Ответ
inline используется для лямбд, чтобы избежать накладных расходов на создание анонимных классов при каждом вызове. Это особенно полезно для высокоуровневых функций (например, map, filter), где лямбды вызываются часто.
Пример:
inline fun performOperation(action: () -> Unit) {
action()
}
// При компиляции код "встраивается", избегая создания объекта Function
performOperation { println("Inline lambda") }
Когда НЕ использовать:
- Для больших лямбд (увеличивает размер бинарника).
- Если лямбда передаётся в другую функцию без
inline(например, в Java-метод). - Для рекурсивных лямбд (невозможно встроить).
Оптимально для коротких лямбд в performance-critical коде.
Ответ 18+ 🔞
А, ну это про inline для лямбд! Слушай, тут история про то, как не тратить ресурсы попусту, как будто на дворе 2002-й год и каждый байт на счету.
Представь, ты пишешь какую-нибудь высокоуровневую функцию, типа map или filter. Ты туда лямбду суёшь — красота, код читается легко. Но компилятор-то под капотом для каждой такой лямбды создаёт анонимный класс, объект этого класса. И если ты эту штуку вызываешь в цикле миллион раз, то получается овердохуища этих одноразовых объектов. Мусорщик потом офигевает, производительность проседает — в общем, пиздопроебибна.
Вот чтобы этого не было, и придумали модификатор inline. Ты его ставишь перед fun, и он как бы говорит компилятору: «Чувак, не создавай тут лишнюю сущность, а просто возьми код из лямбды и вставь его прямо на место вызова, как будто я его там написал».
Пример, чтобы было понятно:
inline fun performOperation(action: () -> Unit) {
action()
}
// Вызываем
performOperation { println("Inline lambda") }
После компиляции это превращается примерно в такую простыню:
// Вместо вызова функции создаётся прямой код
println("Inline lambda")
Видишь? Никакого лишнего объекта action. Просто выполнилось и всё. Волнение ебать — экономия!
Но есть же и подводные камни, хитрая жопа!
Когда НЕ надо использовать inline:
- Если лямбда большая. Ты же не хочешь, чтобы твой скомпилированный код раздулся до неприличных размеров? Встраивать целую простыню текста в десятке мест — терпения ноль ебать у того, кто будет это читать в байткоде.
- Если ты эту лямбду куда-то передаёшь дальше, например, в какую-нибудь Java-библиотеку или в функцию без
inline. Там её уже не встроишь, смысла нет. - Для рекурсивных лямбд. Это вообще технически невозможно, компилятор посмотрит на тебя и скажет: «Чёрта в душу, в сердцу мать! Ты как себе это представляешь?».
Так что правило простое: inline — это для коротких, быстрых лямбд, особенно в тех местах, где каждый микропроцессорный такт на вес золота. Для всего остального — доверия ебать ноль, лучше без него.