169 похожих чатов

Всем доброго утра. Ребят, подскажите пожалуйста по теории: Почему при вызове

лямбды в котлине - создается новый объект?
https://www.youtube.com/watch?v=wAQCs8-a6mg
Что из себя представляет этот объект?
может есть какие статьи на эту тему.

18 ответов

12 просмотров

Потому что в терминах JVM нет понятия "функция", есть только понятие "метод". Поэтому чтобы куда-то передать функцию, надо создать объект, который содержит этот метод. Впрочем, использовать инлайны только для оптимизации этой аллокации очень не рекомендуется

Дмитрий-ДМ Автор вопроса
Alexander Nozik
Потому что в терминах JVM нет понятия "функция", е...

почему не рекомендуется? ведь это прямо таки рекомендуют на оффсайте языка

Дмитрий-ДМ Автор вопроса
Alexander Nozik
Где?

https://kotlinlang.org/docs/inline-functions.html

Дмитрий ДМ
https://kotlinlang.org/docs/inline-functions.html

Тут нет рекомендации его использовать. Сказано, что можно убрать аллокацию. Но во-первых, JVM и так ее обычно убирает (не уверен про андроид), во-вторых, вы при этом сильно усложняете работу родного инлайнера и раздуваете байткод

Дмитрий-ДМ Автор вопроса
Alexander Nozik
Потому что в терминах JVM нет понятия "функция", е...

А разве метод не кладется в стек? на сколько я знаю обычные функции кладутся в стек, лямбда получается только через объект? а соответственно когда пишем inline -она идет в стек? верно мыслю?

Дмитрий ДМ
А разве метод не кладется в стек? на сколько я зна...

В стек кладутся переменные а не методы и понятие стэка в JVM несколько размыто.

Дмитрий-ДМ Автор вопроса
Alexander Nozik
В стек кладутся переменные а не методы и понятие с...

Я начинающий и пытаюсь активно найти правду среди кучи теории из разных статей. Что скажете про информацию в следующей статье: https://javadevblog.com/chto-takoe-heap-i-stack-pamyat-v-java.html#:~:text=Java%20Heap%20(%D0%BA%D1%83%D1%87%D0%B0)%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B5%D1%82%D1%81%D1%8F%20Java,%D0%BF%D0%BE%D0%B4%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%20%D0%B8%20JRE%20%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D1%8B.&text=%D0%97%D0%B4%D0%B5%D1%81%D1%8C%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82%20%D1%81%D0%B1%D0%BE%D1%80%D1%89%D0%B8%D0%BA%20%D0%BC%D1%83%D1%81%D0%BE%D1%80%D0%B0%3A%20%D0%BE%D1%81%D0%B2%D0%BE%D0%B1%D0%BE%D0%B6%D0%B4%D0%B0%D0%B5%D1%82,%D1%81%D1%81%D1%8B%D0%BB%D0%B0%D1%82%D1%8C%D1%81%D1%8F%20%D1%81%20%D0%BB%D1%8E%D0%B1%D0%BE%D0%B9%20%D1%87%D0%B0%D1%81%D1%82%D0%B8%20%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F.

Дмитрий ДМ
Я начинающий и пытаюсь активно найти правду среди ...

Если вы начинающий, не используйте инлайны кроме случаев реификации

Дмитрий ДМ
Я начинающий и пытаюсь активно найти правду среди ...

Примерно так, но что именно JVM помещает в стэк, а что в кучу, она решает на ходу

Дмитрий-ДМ Автор вопроса
Alexander Nozik
Если вы начинающий, не используйте инлайны кроме с...

кстати про рефайнинг. зачем мне гемориться с рефанингом, если я могу определить тип данных в дженерике гораpдо проще через приведение типов - is

Дмитрий ДМ
кстати про рефайнинг. зачем мне гемориться с рефан...

дженерики стираются в рантайме по умолчанию, reified позволяет получить тип дженерика в рантайме

Дмитрий ДМ
кстати про рефайнинг. зачем мне гемориться с рефан...

Потому что дженерики вы таким образом проверить не можете

Дмитрий-ДМ Автор вопроса
Alexander Nozik
Потому что дженерики вы таким образом проверить не...

К сожалению данное утверждение ошибочно, тип дженериков можно проверить через is. вчера собрал обычное консольное приложение и через is в рантайме определил тип джененрика.

Дмитрий ДМ
К сожалению данное утверждение ошибочно, тип джене...

В общем случае нельзя. Есть несколько исключений, когда можно, но это именно что исключения

Дмитрий ДМ
К сожалению данное утверждение ошибочно, тип джене...

смотрите, никаких проблем скастить дженерик к чему угодно

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта