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

时间:2019-04-10 10:38:13

标签: c garbage-collection kotlin-native

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

  

A:Kotlin / Native提供了一种自动内存管理方案,   类似于Java或Swift提供的功能。当前执行   包括带有循环收集器的自动参考计数器   收集周期性垃圾。

我或多或少地了解了它在Java或Kotlin(JVM)中的工作方式。有没有人能详细描述如何使用C项目在Kotlin / Native中管理内存?

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

我还发现了here

  

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

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

1 个答案:

答案 0 :(得分:0)

K / N中的内存管理由运行时提供。它包括两个主要部分:自动参考计数和周期收集器。就像在Kotlin / JVM中一样,这提供了编写代码的可用性。可以在此file中进行挖掘,以获取有关此主题的一些详细信息,但是您只需要知道默认情况下它是自动的即可。


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