Сборщик мусора, описанный выше, используется для управления данными, видимыми
из программ Lisp, а также большей частью данных, используемых внутренне
интерпретатором Lisp. Иногда может быть полезно выделять временные
внутренние объекты, используя стек интерпретатора на языке C. Это может
повысить производительность, поскольку выделение в стеке обычно быстрее, чем
использование памяти кучи для выделения, а сборщик мусора для освобождения.
Недостатком является то, что использование таких объектов после их освобождения
приводит к неопределенному поведению, поэтому использование должно быть
тщательно обдумано и отлажено с помощью функции GC_CHECK_MARKED_OBJECTS
(см. src/alloc.c). В частности, объекты, выделенные в
стеке, никогда не должны быть сделаны видимыми для кода Lisp пользователя.
В настоящее время таким образом могут выделяться ячейки cons и
строки. Это реализовано с помощью макросов C, таких как AUTO_CONS
и AUTO_STRING, которые определяют именованный Lisp_Object
с временем жизни блока. Эти объекты не освобождаются сборщиком мусора; вместо
этого они имеют автоматическую продолжительность хранения, то есть они выделяются
как локальные переменные и автоматически освобождаются по окончании выполнения
блока C, который определил объект.
По соображениям производительности, строки, выделенные в стеке, ограничены
символами ASCII, и многие из этих строк являются
неизменяемыми, то есть вызов ASET для них приводит к
неопределенному поведению.