Size: a a a

Kotlin Community

2020 November 19

RU

Roman Ushakov in Kotlin Community
Andrew Mikhaylov
Это массив, массив — это класс. Передаётся точно так же, как и другие — value by reference. Не by value, то бишь весь массив не копирутся при передаче.
Так же подумал.
Вообще, странный вопрос я задал иначе бы была куча утечек памяти.
Так как файлы хранят зачастую, как массив байт
источник

AN

Alexander Nozik in Kotlin Community
Andrew Mikhaylov
Это массив, массив — это класс. Передаётся точно так же, как и другие — value by reference. Не by value, то бишь весь массив не копирутся при передаче.
На самом деле нет, это ByteArray, он класс с точки зрения котлин, но не с точки зрения JVM.
источник

PE

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

AM

Andrew Mikhaylov in Kotlin Community
Roman Ushakov
Так же подумал.
Вообще, странный вопрос я задал иначе бы была куча утечек памяти.
Так как файлы хранят зачастую, как массив байт
Откуда утечек? :)
источник

IP

Iaroslav Postovalov in Kotlin Community
Alexander Nozik
На самом деле нет, это ByteArray, он класс с точки зрения котлин, но не с точки зрения JVM.
с точки зрения JVM - тоже класс, только с ним работают через другие инструкции абсолютно
источник

AN

Alexander Nozik in Kotlin Community
Iaroslav Postovalov
с точки зрения JVM - тоже класс, только с ним работают через другие инструкции абсолютно
Он такой очень особый класс.
источник

RU

Roman Ushakov in Kotlin Community
Andrew Mikhaylov
Откуда утечек? :)
Если бы файл в byte[] весом 5Gb передавался по значению...
А не, как ссылка на значение то каждая такая передача разве бы не создавала дополнительные 5gb информации?
источник

AM

Andrew Mikhaylov in Kotlin Community
Roman Ushakov
Если бы файл в byte[] весом 5Gb передавался по значению...
А не, как ссылка на значение то каждая такая передача разве бы не создавала дополнительные 5gb информации?
Я не уверен, что стек тянется на 5 гб, но даже если и тянется — это ж не утечка памяти, эта память вполне используется приложением.
источник

AM

Andrew Mikhaylov in Kotlin Community
Утечка — это если память забыли деаллоцировать после завершения работы с ней, тут в теории вполне легитимное её использование.
источник

IP

Iaroslav Postovalov in Kotlin Community
Alexander Nozik
Он такой очень особый класс.
угу
источник

AN

Alexander Nozik in Kotlin Community
Andrew Mikhaylov
Я не уверен, что стек тянется на 5 гб, но даже если и тянется — это ж не утечка памяти, эта память вполне используется приложением.
Если я не ошибаюсь, там умный алокатор, он на ходу решает, куда что пихать. В зависимости от размера.
источник

AM

Andrew Mikhaylov in Kotlin Community
Alexander Nozik
Если я не ошибаюсь, там умный алокатор, он на ходу решает, куда что пихать. В зависимости от размера.
Ну мы тут говорим о передаче массива по значению, который вообще не про джаву. Так что джавовые аллокаторы тут применять смысла нет)
источник

IP

Iaroslav Postovalov in Kotlin Community
Andrew Mikhaylov
Я не уверен, что стек тянется на 5 гб, но даже если и тянется — это ж не утечка памяти, эта память вполне используется приложением.
в си какой-нбиудь long[5000000] очень даже пойдет на стековую память. и переполнит ее к чертям
источник

AN

Alexander Nozik in Kotlin Community
Andrew Mikhaylov
Ну мы тут говорим о передаче массива по значению, который вообще не про джаву. Так что джавовые аллокаторы тут применять смысла нет)
Я вооще исходо сказал, что это "по значению" "по ссылке" в плюсовом смысле тянуть не надо. Реально всегда действительно передается значение. Только это значениее почти всегда ссылка. Копирование значения происходит только для примитивов.
источник

AN

Alexander Nozik in Kotlin Community
В частных случаях JVM подкручивает разные штуки при скаляризации
источник

RU

Roman Ushakov in Kotlin Community
Andrew Mikhaylov
Утечка — это если память забыли деаллоцировать после завершения работы с ней, тут в теории вполне легитимное её использование.
На самом деле такое можно посчитать утечкой потому что можно много чего придумать, чтобы не грузить весь файл в память
источник

AM

Andrew Mikhaylov in Kotlin Community
Roman Ushakov
На самом деле такое можно посчитать утечкой потому что можно много чего придумать, чтобы не грузить весь файл в память
Об этом я спорить не готов.
источник

AA

Andrey Antipov in Kotlin Community
В общем, возвращаясь к тесту с помощью swap: в Котлин можно эмулировать передачу по ссылке, но в чистом виде её нет (приходится оборачивать в объект/доставать значение):
class Ref<V>(var unRef: V)
val <V> V.ref: Ref<V> get() = Ref(this)

fun main() {
   fun <V> swap(x: Ref<V>, y: Ref<V>) = x.unRef.let {
       x.unRef = y.unRef
       y.unRef = it
   }

   val x = 1.ref
   val y = 2.ref
   println("Before swap: x=${x.unRef}, y=${y.unRef}")
   swap(x, y)
   println(" After swap: x=${x.unRef}, y=${y.unRef}")
}
источник

AN

Alexander Nozik in Kotlin Community
Roman Ushakov
На самом деле такое можно посчитать утечкой потому что можно много чего придумать, чтобы не грузить весь файл в память
Ага, расскажите это питонистам. Простите за оффтоп. Я как-то задолбался одному объяснять, что есть поточная обработка.
источник

RU

Roman Ushakov in Kotlin Community
Alexander Nozik
Ага, расскажите это питонистам. Простите за оффтоп. Я как-то задолбался одному объяснять, что есть поточная обработка.
О_о боль, я даже не думал, что кому-то может быть не знакома потоковая обработка данных.
В зависимости от формата данных это может быть очень сложно, но зачастую профит себя оправдывает, исключая те случаи, когда можно сократить размеры обрабатываемых данных
источник