12

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

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

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

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

另外,我在这里找到:

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

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

4

1 回答 1

12

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 存储库的示例中看到很多这种方法的示例

于 2019-05-30T14:48:58.547 回答