填充指针是否会影响GC?

时间:2016-01-16 22:29:50

标签: arrays common-lisp fill-pointer

如果我有这个结构:

(defstruct foo
  (x 0 :type 'fixnum))

和这个数组:

(defvar arr (make-array 0 :element-type 'foo :adjustable t :fill-pointer 0))

然后执行以下操作:

(vector-push-extend (make-foo) arr)
(setf (fill-pointer arr) 0)

数组中的foo现在是GC的候选者吗?

我从CLHS了解到它不是active,但不确定该州的含义。

1 个答案:

答案 0 :(得分:9)

超出填充指针的元素仍然可以访问,并且不会被垃圾回收。打印数组时不会打印填充指针之外的元素,如果使用ARRAY-PUSH它们将被覆盖(因为它使用填充指针来确定添加新元素的位置),但阵列上的其他操作通常会对它们进行处理。

例如,AREF的规范说:

  

aref忽略填充指针。允许使用aref访问任何数组元素,无论是否有效。