图 13.4 港口

    一个程序的初始版本这么写简直是棒呆了,但它会产生许多的垃圾。当这个程序运行时,它会在两个方面构造:当船只进入港口时,新的结构将会被分配;而 harbor 的每一次增大都需要使用构造。

    1. (defconstant pool (make-array 1000 :fill-pointer t))
    2. (dotimes (i 1000)
    3. (setf (aref pool i) (make-ship)))
    4. (defconstant harbor (make-hash-table :size 1100
    5. (defun enter (n f d)
    6. (let ((s (if (plusp (length pool))
    7. (vector-pop pool)
    8. (make-ship))))
    9. (setf (ship-name s) n
    10. (ship-flag s) f
    11. (ship-tons s) d
    12. (defun find-ship (n) (gethash n harbor))
    13. (defun leave (n)
    14. (let ((s (gethash n harbor)))
    15. (remhash n harbor)
    16. (vector-push s pool)))

    图 13.5 港口(第二版)

    我们使用存储池的行为实际上是肩负起内存管理的工作。这是否会让我们的程序更快仍取决于我们的 Lisp 实现怎样管理内存。总的说来,只有在那些仍使用着原始垃圾回收器的实现中,或者在那些对 GC 的不可预见性比较敏感的实时应用中才值得一试。