Kotlin/Native 垃圾收集器如何在 C 中工作?

Val*_* K. 12 c garbage-collection kotlin-native

我在JetBrains FAQ 中找到了对 Kotlin/Native 内存管理模型的一些解释。

答:Kotlin/Native 提供了一种自动化的内存管理方案,类似于 Java 或 Swift 提供的方案。当前的实现包括一个自动引用计数器和一个循环收集器来收集循环垃圾。

我或多或少了解它在 Java 或 Kotlin (JVM) 中的工作原理。任何人都可以详细描述如何在使用 C 的项目中在 Kotlin/Native 中管理内存?

另外,如果有垃圾收集器,为什么我们需要 Kotlin/Native 函数 memScoped { }?

另外,我在这里找到

Kotlin/Native 是一种将 Kotlin 编译为无需任何 VM 即可运行的原生二进制文件的技术。从广义上讲,Native 代码是任何内存不由底层框架管理而必须由程序员自己管理的代码。即没有垃圾收集。例如 C++ 的删除和 C 的免费

我认为这与 JetBrains 常见问题解答中的内容相矛盾

Art*_*rev 10

K/N 中的内存管理由运行时提供。它由两个主要部分组成:自动引用计数和循环收集器。这为编写代码提供了可用性,就像在 Kotlin/JVM 中一样。可以在此文件中找到有关此主题的一些详细信息,但您需要知道的是默认情况下它是自动的。


关于 MemScoped 等。当您使用与 C 的互操作性时,您必须处理管理诸如本机内存之类的资源。本机内存是操作系统提供给应用进程的内存。由于与 Kotlin 代码无关,因此无法由 K/N 运行时管理此资源。但是struct您要使用的所有 C和变量都必须在那里分配。您可以直接通过调用nativeHeap.alloc()函数来完成。当这个内存的需求消失时,它可以被释放nativeHeap.free()。但是为了让您的体验更舒适,K/N 也有Arena类,实现基于区域的内存管理。它将内存管理简化为一系列alloc()您需要的任何地方,并通过以下方式重新分配.clear()对于所有地区。此外,还有一个 MemScoped {} 块,它涵盖了您的 Arena,甚至可以忘记释放本机内存。因此,在包含来自 C 的某些元素的代码中,您只需编写MemScoped { ... },然后将操作放入其中。您可以在 K/N 存储库的示例中看到很多这种方法的示例