上文描述的垃圾回收器用于管理 Lisp 程序可见的数据,以及 Lisp 解释器内部使用的大部分数据。有时,使用解释器的 C 栈分配临时的内部对象会很有用。这有助于提升性能,因为栈分配通常比使用堆内存分配、垃圾回收器释放更快。缺点是,在这类对象被释放后继续使用会导致未定义行为,因此应当谨慎规划使用场景,并通过 GC_CHECK_MARKED_OBJECTS 功能仔细调试(参见 src/alloc.c)。特别地,栈分配的对象绝不能对用户的 Lisp 代码可见。
目前,cons 单元和字符串可以通过这种方式分配。该功能由 AUTO_CONS、AUTO_STRING 等 C 宏实现,这些宏会定义一个具有块生命周期的命名 Lisp_Object。这类对象不会被垃圾回收器释放;相反,它们拥有自动存储周期,即像局部变量一样分配,并在定义该对象的 C 块执行结束时自动释放。
出于性能考虑,栈分配的字符串仅限于 ASCII 字符,且大部分这类字符串是不可变的,即对它们调用 ASET 会产生未定义行为。