显式堆栈分配的数据

时间:2017-10-16 00:32:35

标签: common-lisp stack-allocation

我认为在大多数Common Lisp cons实现的实现中,通常/总是堆分配(参见Why is consing in Lisp slow?

Common Lisp确实提供了一个从函数返回多个值的工具(在返回时使用values并在调用站点返回multiple-value-bind)。我在这里猜测一下,但我认为这种结构的动机是双重的:1)使truncate之类的函数更容易在典型的情况下使用,在这种情况下你不关心丢弃的值和2 )可以在不使用堆分配的数据结构的情况下返回多个值,并且(取决于实现(?))完全避免堆(以及后来的GC开销)。

Common Lisp(或者像SBCL这样的特定实现)是否能够使用堆栈分配的数据(可能与弱引用一起使用)或创建复合/大型值类型(类似于C中的结构) )?

1 个答案:

答案 0 :(得分:6)

Common Lisp有一个DYNAMIC-EXTENT声明。实现可以使用此信息来堆栈分配一些数据结构 - 它们也可以忽略此声明。

请参阅相应的文档,了解一些实现如何支持它:

其他实现也支持它,但它们可能缺乏关于它的明确文档。

显式支持返回多个值的主要动机是摆脱返回值的consing / destructuring列表,甚至将一些结果放在全局变量中。因此,现在可以在寄存器中或通过堆栈返回多个值。