|
|
1
1
基本上,这在GHC中描述 RTS documentation 当它详细描述堆对象的格式时,包含一个头和一个有效负载。 头描述负载的哪些字是指针,以便垃圾收集可以工作。 这意味着,对于任何堆对象,大致都有一个单词的开销。 |
|
|
2
6
简短的版本是:将所有指针和所有非指针组合在一起分配值,并包含一点元数据,这样GC就知道接下来要做什么。
注意haskell报告实际上允许
稍长一点的版本是说“元数据”实际上是垃圾收集器使用的两个函数。要给出一个粗略的草图,您可以将haskell中的值视为在运行时用方法表示为OO样式的对象:
其结果是,值对自己的了解足以进行簿记,并且对于一些常见的布局,GHC定义了这些函数的专门版本;垃圾收集器主要不知道清道夫和清道夫是如何工作的。指针和非指针的分离是为了能够为常见情况创建和共享通用实现。 请注意,即使对于不是“函数”的haskell值也存在“enter”函数,因为延迟意味着即使类型为int,计算仍可能涉及计算。 如果你想要很长的版本,我建议你阅读: 关于Haskell是如何映射到硬件的,这涉及到很多细节。这是一本引人入胜的书,里面有很多整洁的东西,与大多数(严格的)功能语言的实现方式有很大的不同。这篇论文很旧,但仍然相关。 |