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

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

34 ответов

40 просмотров

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

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

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
Ну мы тут говорим о передаче массива по значению, ...

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

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта