Явно размещенные в стеке данные

Я думаю, что в большинстве реализаций Common Lisp cons-ячейки обычно / всегда выделяются в куче (см. Почему медленное согласование в Lisp-е?)

Common Lisp предоставляет возможность возврата нескольких значений из функции (используя values при возвращении и multiple-value-bind на сайте вызова). Я немного размышляю здесь, но я думаю, что мотивация для этой конструкции двояка: 1) сделать функции вроде truncate проще в использовании в типичном случае, когда вас не волнует сброшенное значение и 2) позволяют возвращать несколько значений без использования структуры данных, выделенной в куче, и (в зависимости от реализации (?)) избегать кучи полностью (и GC наверху позже по дороге).

Предоставляет ли Common Lisp (или конкретная реализация, например, SBCL) возможность использовать данные, выделенные из стека (возможно, в сочетании с чем-то вроде слабых ссылок), или создавать составные типы значений / значений большого размера (что-то вроде структур в C)?

1 ответ

Решение

Common Lisp имеет объявление DYNAMIC-EXTENT. Реализации могут использовать эту информацию для размещения в стеке некоторых структур данных - они также могут игнорировать это объявление.

Посмотрите соответствующую документацию, как некоторые реализации поддерживают это:

Другие реализации также поддерживают это, но они могут не иметь явной документации об этом.

Основной мотивацией для явной поддержки возврата нескольких значений было избавление от обработки / уничтожения списков возвращаемых значений или даже помещение некоторых результатов в глобальные переменные. Таким образом, теперь можно возвращать несколько значений в регистрах или через стек.

Другие вопросы по тегам