Как работает Kotlin / Native сборщик мусора в C? - PullRequest
4 голосов
/ 10 апреля 2019

Я нашел некоторое объяснение модели управления памятью Kotlin / Native в JetBrains FAQ .

A: Kotlin / Native предоставляет автоматизированную схему управления памятью, похоже на то, что обеспечивает Java или Swift. Текущая реализация включает в себя автоматический счетчик ссылок с циклическим коллектором для собирать циклический мусор.

Я более или менее понимаю, как это работает в Java или Kotlin (JVM). Можно ли подробно описать, как память управляется в Kotlin / Native в проектах с C?

Кроме того, если есть сборщик мусора, зачем нам нужна функция Kotlin / Native memScoped {}?

Также я нашел здесь :

Kotlin / Native - это технология компиляции Kotlin в собственные двоичные файлы, которые работают без каких-либо виртуальных машин. Вообще говоря, нативный код - это любой код, память которого не управляется базовой платформой, но должна управляться самим программистом. т.е. нет сборки мусора. например C ++ 'удалить, а C бесплатно

что на мой взгляд противоречит написанному в FAQ по JetBrains

1 Ответ

0 голосов
/ 30 мая 2019

Управление памятью в K / N обеспечивается средой выполнения.Он состоит из двух основных частей: автоматического подсчета ссылок и цикла сбора.Это дает возможность писать код так же, как в Kotlin / JVM.Некоторые подробности по этой теме можно найти, копаясь в этом файле , но все, что вам нужно знать, это то, что по умолчанию он автоматический.


О MemScoped и т. Д. При использовании взаимодействия сC, вам приходится иметь дело с управлением таким ресурсом, как native memory .Собственная память - это память, предоставляемая процессу приложения операционной системой.Поскольку он не имеет ничего общего с кодом Kotlin, этот ресурс не может управляться средой выполнения K / N.Но все C struct s и переменные, которые вы собираетесь использовать, должны быть размещены там.Вы можете сделать это прямо, вызвав функцию nativeHeap.alloc().Когда потребность в этой памяти исчезнет, ​​ее можно освободить с помощью nativeHeap.free().Но чтобы вам было удобнее, K / N также имеет класс Arena, реализующий управление памятью на региональной основе.Это упрощает управление памятью до всего лишь серии alloc(), где вам нужно, и одного освобождения на .clear() для всего региона.Кроме того, есть блоки MemScoped {}, которые покрывают вашу арену и позволяют забыть даже об освобождении родной памяти.Таким образом, в вашем коде, который включает в себя некоторые элементы из C, вы можете просто написать MemScoped { ... }, а затем поместить в него операции.Вы можете увидеть множество примеров такого подхода в samples из репозитория K / N

...