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

... в котлине строки передаются по ссылке или по значению?

34 ответов

42 просмотра

А разница? Если строки неизменяемые.

по ссылке, но так как они имутабельные - большой разницы нету

Lev-Shagalov Автор вопроса
Павло Гриник
по ссылке, но так как они имутабельные - большой р...

Ну, когда строка пару кило, тогда разница таки есть

Почти всё передаётся по ссылке, исключений по пальцам пересчитать (числовые примитивы, boolean, по-моему всё). Как и в джаве. А почему вы спрашиваете?

По ссылке, но они неизменяемые

Lev-Shagalov Автор вопроса
Kirill Gamazkov
Почти всё передаётся по ссылке, исключений по паль...

Не смущай народ. Kotlin, как и Java, не имеет pass by reference семантики. Всё передаётся по значению. Другое дело, что у нас нет в этих языках прямого доступа к самим объектам, только через ссылки. https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value http://www.javadude.com/articles/passbyvalue.htm Если бы была семантика передачи по ссылке, то можно было бы реализовать функцию swap: var1 = ...; var2 = ...; swap(var1, var2); Но такое нельзя сделать ни в Java, ни в Kotlin. в С++ можно, так как там есть передача по ссылке.

Andrey Antipov
Не смущай народ. Kotlin, как и Java, не имеет pass...

Ну это ты уже в дебри полез. За пределами С++ немного найдётся языков, где ссылка и указатель - разные вещи

Kirill Gamazkov
Ну это ты уже в дебри полез. За пределами С++ немн...

Это не дебри, это основы. Вот простой тест, который я привёл с функцией swap. можно реализовать - есть передача по ссылке. Нельзя - нету.

Andrey Antipov
Это не дебри, это основы. Вот простой тест, которы...

Это даже скорее спор о терминах. Можно считать, что вообще всё и везде передаётся по значению, но иногда это значение - указатель. То, что ты подразумеваешь под ссылкой - синтаксический сахар над указателем.

Kirill Gamazkov
Это даже скорее спор о терминах. Можно считать, чт...

Можно и системный блок называть процессором. Но это будет не корректно. :)

Kirill Gamazkov
Это даже скорее спор о терминах. Можно считать, чт...

Я понимаю под ссылкой ровно то, что под ней понимается в языке C++, откуда и пошёл этот термин. Можно конечно под ним понимать что-то другое, но тогда тебя не поймут те, кто знаком с исходной терминологией.

Andrey Antipov
Я понимаю под ссылкой ровно то, что под ней понима...

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

Pavel Erokhin
Мы все-таки пишем на котлине, и под ссылкой подраз...

На этот случай есть ссылка на википедию с описанием сути термина передача по ссылке.

Andrey Antipov
Я понимаю под ссылкой ровно то, что под ней понима...

Подразумевают обычно все-таки возможность менять входные значения, а не чего там в стек ложится

Pavel Erokhin
Мы все-таки пишем на котлине, и под ссылкой подраз...

Ссылка — это одно и то же и там, и там. И это не совсем спор сугубо о терминологии, выше и правда верно привели пример практической разницы. В JVM (и Kotlin это унаследовал на всех платформах) фактически не pass by reference, а pass value by reference.

Alexander Nozik
Подразумевают обычно все-таки возможность менять в...

Ну так и не получится поменять переданный объект на что-то другое изнутри функции, так чтобы эти изменения снаружи было видно. Состояние объекта, если он изменяемый - да, но сам объект - нет.

Kirill Gamazkov
Почти всё передаётся по ссылке, исключений по паль...

Что на счёт byte[]? Почему-то резко захотел спросить

Roman Ushakov
Что на счёт byte[]? Почему-то резко захотел спроси...

Это массив, массив — это класс. Передаётся точно так же, как и другие — value by reference. Не by value, то бишь весь массив не копирутся при передаче.

Andrew Mikhaylov
Это массив, массив — это класс. Передаётся точно т...

Так же подумал. Вообще, странный вопрос я задал иначе бы была куча утечек памяти. Так как файлы хранят зачастую, как массив байт

Andrew Mikhaylov
Это массив, массив — это класс. Передаётся точно т...

На самом деле нет, это ByteArray, он класс с точки зрения котлин, но не с точки зрения JVM.

Andrew Mikhaylov
Ссылка — это одно и то же и там, и там. И это не с...

Да, pass value by reference максимально корректно))

Alexander Nozik
На самом деле нет, это ByteArray, он класс с точки...

с точки зрения JVM - тоже класс, только с ним работают через другие инструкции абсолютно

Andrew Mikhaylov
Откуда утечек? :)

Если бы файл в byte[] весом 5Gb передавался по значению... А не, как ссылка на значение то каждая такая передача разве бы не создавала дополнительные 5gb информации?

Roman Ushakov
Если бы файл в byte[] весом 5Gb передавался по зна...

Я не уверен, что стек тянется на 5 гб, но даже если и тянется — это ж не утечка памяти, эта память вполне используется приложением.

Andrew Mikhaylov
Я не уверен, что стек тянется на 5 гб, но даже есл...

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

Alexander Nozik
Если я не ошибаюсь, там умный алокатор, он на ходу...

Ну мы тут говорим о передаче массива по значению, который вообще не про джаву. Так что джавовые аллокаторы тут применять смысла нет)

Andrew Mikhaylov
Я не уверен, что стек тянется на 5 гб, но даже есл...

в си какой-нбиудь long[5000000] очень даже пойдет на стековую память. и переполнит ее к чертям

Andrew Mikhaylov
Ну мы тут говорим о передаче массива по значению, ...

Я вооще исходо сказал, что это "по значению" "по ссылке" в плюсовом смысле тянуть не надо. Реально всегда действительно передается значение. Только это значениее почти всегда ссылка. Копирование значения происходит только для примитивов.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно 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
Карта сайта