Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 外来数据和垃圾收集_Haskell_Garbage Collection_Ffi - Fatal编程技术网

Haskell 外来数据和垃圾收集

Haskell 外来数据和垃圾收集,haskell,garbage-collection,ffi,Haskell,Garbage Collection,Ffi,当我通过FFI分配一些数据并将终结器与之关联时,我在Haskell中得到一个ForeignPtr。当该指针未被引用时,GC将收集该指针,从而使终结器运行。但是收集只在GC运行时发生,并且“取消引用”不会强制GC运行。也就是说,可能有很多指针,但由于指针本身不占用太多内存,RTS根本看不到启动GC的理由,因为RTS没有跟踪外来数据的大小,根据我的说法。这是正确的吗 我如何与RTS沟通“当指针未被引用时,立即收集它”?是否有允许控制何时启动GC的标志?对于一个真正的程序来说,这是一个问题吗(因为任何

当我通过FFI分配一些数据并将终结器与之关联时,我在Haskell中得到一个
ForeignPtr
。当该指针未被引用时,GC将收集该指针,从而使终结器运行。但是收集只在GC运行时发生,并且“取消引用”不会强制GC运行。也就是说,可能有很多指针,但由于指针本身不占用太多内存,RTS根本看不到启动GC的理由,因为RTS没有跟踪外来数据的大小,根据我的说法。这是正确的吗


我如何与RTS沟通“当指针未被引用时,立即收集它”?是否有允许控制何时启动GC的标志?对于一个真正的程序来说,这是一个问题吗(因为任何真正的程序总是有足够的显式垃圾来刺激GC)?

理解指针何时变为未引用并不是件小事。 据我所知,无法执行您的请求,即通知GC指针现在不再可访问。充其量,可以触发GC循环,但没有硬保证

根据您的描述,您可能更喜欢引用计数机制而不是垃圾收集。然而,特别是在复杂的纯代码中,很难确定计数器应该递增或递减的点:在基于状态或IO的单子中,如果这些副作用在计算的其余部分正确排序,则更容易确定

如果您真的不需要超过“1”的引用计数,那么一个常见的习惯用法是使用
风格的函数来处理分配和解除分配。
这可能会让正确处理变得有点棘手

例如,一个微不足道的实现可能是

-- very simplified code
withMyResource :: (ResourcePtr -> IO r) -> IO r
withMyResource action = do
   p <- allocResourcePtr
   result <- action p
   deallocResourcePtr p
   return result
请注意,这并不是完全安全的,因为可能会返回指针,使其在解除分配后处于活动状态

ptr <- withResource return
use ptr -- dangerous!

ptr理解指针何时变为未引用并非易事。
据我所知,无法执行您的请求,即通知GC指针现在不再可访问。充其量,可以触发GC循环,但没有硬保证

根据您的描述,您可能更喜欢引用计数机制而不是垃圾收集。然而,特别是在复杂的纯代码中,很难确定计数器应该递增或递减的点:在基于状态或IO的单子中,如果这些副作用在计算的其余部分正确排序,则更容易确定

如果您真的不需要超过“1”的引用计数,那么一个常见的习惯用法是使用
风格的函数来处理分配和解除分配。
这可能会让正确处理变得有点棘手

例如,一个微不足道的实现可能是

-- very simplified code
withMyResource :: (ResourcePtr -> IO r) -> IO r
withMyResource action = do
   p <- allocResourcePtr
   result <- action p
   deallocResourcePtr p
   return result
请注意,这并不是完全安全的,因为可能会返回指针,使其在解除分配后处于活动状态

ptr <- withResource return
use ptr -- dangerous!

ptr在GC运行之前,RTS不知道是否有任何数据段未被引用。GHC没有引用计数GC,这将允许对垃圾立即执行操作。您可以尝试自己实现引用计数,或者从中使用手动GC

在Haskell土地上没有跟踪外国分配。如果您想要更多的控制,但没有自定义GC或引用计数,可以使用e。G用于手动/范围分配和解除分配


另一种选择是在GHC RTS中使用固定分配。这将为您提供不被GC移动的内存。对固定数据的引用可以无开销地传递到外部代码,但是固定数据可以被跟踪,可以是GC-d,并像通常的堆数据一样触发GC。一个用于固定数据的API。另一个选择很简单。固定数据的可能缺点是内存碎片和分配速度较慢,但这也适用于(任何)返回稳定指针的外部分配。

RTS不知道在GC运行之前是否有任何数据段未被引用。GHC没有引用计数GC,这将允许对垃圾立即执行操作。您可以尝试自己实现引用计数,或者从中使用手动GC

在Haskell土地上没有跟踪外国分配。如果您想要更多的控制,但没有自定义GC或引用计数,可以使用e。G用于手动/范围分配和解除分配

另一种选择是在GHC RTS中使用固定分配。这将为您提供不被GC移动的内存。对固定数据的引用可以无开销地传递到外部代码,但是固定数据可以被跟踪,可以是GC-d,并像通常的堆数据一样触发GC。一个用于固定数据的API。另一个选择很简单。固定数据的可能缺点是内存碎片和分配速度较慢,但这也适用于(任何)返回稳定指针的外部分配。

讨论了这个问题。这是一个很好的总结,目前的艺术水平为这类事情。谈到这个问题。这是一个很好的总结,目前的艺术水平为这类事情。