Почему появляется развилка разумности и неразумности помечания функции inline

Ответ

Пометка inline может быть разумной или неразумной в зависимости от контекста.

Разумно:

  • Для лямбда-функций, передаваемых в высокоуровневые функции (например, map, filter), чтобы избежать накладных расходов на создание анонимных классов.
  • Для небольших функций, часто вызываемых в цикле, чтобы избежать накладных расходов на вызов.
inline fun <T> List<T>.customFilter(predicate: (T) -> Boolean): List<T> {
    return filter(predicate) // Лямбда будет встроена
}

Неразумно:

  • Для больших функций, так как увеличивается размер бинарного кода.
  • Для рекурсивных функций (Kotlin не поддерживает рекурсивный inline).
  • Для функций с crossinline или noinline параметрами, если нет явной необходимости.

Выбор зависит от производительности и читаемости кода.

Ответ 18+ 🔞

А, ну это про inline в Kotlin. Ёпта, тема-то какая, прямо классика жанра, как выбор между чаем и кофе с утра. Давай разжую, чтобы ты не ломал голову попусту.

Смотри, суть в том, что когда ты пишешь inline перед функцией, ты говоришь компилятору: "Слушай, дружище, не городи тут огород с анонимными классами для моих лямбд, просто вставь код этой функции прямо на место вызова, как будто я его там и написал". И это, блядь, иногда овердохуища полезно.

Когда это прям рулит и пизда рулю:

Представь, у тесть есть функция-фильтр, которая принимает лямбду. Без inline под капотом для каждой такой лямбды создаётся объект. Это как нанять целый грузовик, чтобы перевезти одну бутылку воды — оверкилл, накладные расходы ебать. А если ты эту штуку в цикле на миллион элементов вызываешь? Вот тут inline и спасает — код лямбды просто вставляется на место, и никаких лишних объектов. Красота!

inline fun <T> List<T>.customFilter(predicate: (T) -> Boolean): List<T> {
    return filter(predicate) // Всё, приехали. predicate будет встроен прямо сюда.
}

А теперь, чувак, когда это полная хуйня и только проблемы создаст:

  1. Функция размером с "Войну и мир". Ты же не хочешь, чтобы компилятор копипастил три экрана кода в каждую точку вызова? Размер бинарника взлетит до небес, ядрёна вошь! Терпения ноль ебать у того, кто будет это компилировать.
  2. Рекурсивные функции. Тут Kotlin просто скажет тебе "иди ты нахуй" на этапе компиляции. Он не умеет встраивать рекурсию, и правильно делает. Представь эту бесконечную вставку — кошмар.
  3. Когда ты уже испортил всё crossinline или noinline. Зачем ты тогда вообще inline повесил? Ты либо встраивай, либо не встраивай. Это как прийти в баню и плавать в одежде — смысл-то какой? Если уж начал оптимизировать, иди до конца.

Итог, блядь, простой: голова должна работать. inline — это острый инструмент, а не молоток, которым всё подряд забивать надо. Используй его точечно, для мелких функций с лямбдами, особенно в горячих участках кода. Для всего остального — без него обойдёшься, и код чище будет, и бинарник не раздует как шарик. Э, бошка, думай!