E.4 Объекты, выделенные в стеке

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

В настоящее время таким образом могут выделяться ячейки cons и строки. Это реализовано с помощью макросов C, таких как AUTO_CONS и AUTO_STRING, которые определяют именованный Lisp_Object с временем жизни блока. Эти объекты не освобождаются сборщиком мусора; вместо этого они имеют автоматическую продолжительность хранения, то есть они выделяются как локальные переменные и автоматически освобождаются по окончании выполнения блока C, который определил объект.

По соображениям производительности, строки, выделенные в стеке, ограничены символами ASCII, и многие из этих строк являются неизменяемыми, то есть вызов ASET для них приводит к неопределенному поведению.