显式堆栈分配的数据

Gre*_*bet 3 common-lisp stack-allocation

我认为在Common Lisp cons的大多数实现中,通常/总是堆分配(请参阅为什么Lisp中的consing缓慢?)

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

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

Rai*_*wig 6

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

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

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

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