Spec-Zone.ru › Elisp

Объекты, выделенные на стеке

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

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

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

Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Stack_002dallocated-Objects.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API