Next: , Up: Efficiency


5.1 Dynamic-extent allocation

SBCL has limited support for performing allocation on the stack when a variable is declared dynamic-extent. The dynamic-extent declarations are not verified, but are simply trusted; if the constraints in the Common Lisp standard are violated, the best that can happen is for the program to have garbage in variables and return values; more commonly, the system will crash.

As a consequence of this, the condition for performing stack allocation is stringent: either of the speed or space optimization qualities must be higher than the maximum of safety and debug at the point of the allocation. For example:

     (locally
       (declare (optimize speed (safety 1) (debug 1)))
       (defun foo (&rest rest)
         (declare (dynamic-extent rest))
         (length rest)))

Here the &rest list will be allocated on the stack. Note that it would not be in the following situation:

     (defun foo (&rest rest)
       (declare (optimize speed (safety 1) (debug 1)))
       (declare (dynamic-extent rest))
       (length rest))

because both the allocation of the &rest list and the variable binding are outside the scope of the optimize declaration.

There are many cases when dynamic-extent declarations could be useful. At present, SBCL implements

Future plans include