【问题标题】:Explicitly stack-allocated data显式堆栈分配的数据
【发布时间】:2018-03-27 10:48:46
【问题描述】:

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

Common Lisp 确实提供了从函数返回多个值的功能(在返回时使用values,在调用处使用multiple-value-bind)。我在这里推测了一下,但我认为这种构造的动机有两个方面:1)使truncate 之类的函数在您不关心丢弃值的典型情况下更易于使用;2)使可以在完全不使用堆分配数据结构的情况下返回多个值,并且(取决于实现(?))完全避免堆(以及以后的 GC 开销)。

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

【问题讨论】:

标签: common-lisp stack-allocation


【解决方案1】:

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

查看一些实现如何支持它的相应文档:

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

明确支持返回多个值的主要动机是摆脱对返回值的约束/解构列表,甚至将一些结果放入全局变量中。因此,现在可以在寄存器中或通过堆栈返回多个值。

【讨论】:

    猜你喜欢
    • 2012-06-05
    • 2011-09-06
    • 2016-04-14
    • 1970-01-01
    • 2012-06-26
    • 2011-10-06
    • 2018-06-18
    • 2017-08-12
    • 1970-01-01
    相关资源
    最近更新 更多