为什么在给数组赋值时要用到cons?

编程语言 2026-07-10

我遇到了一个问题:在sbcl中给大型数组设值时,会进行大量的内存分配(俗称consing),而我又需要频繁这样做,导致堆空间很快被占满。产生consing的原因是什么,是否有可避免的办法?

下面是我尝试的:

(defun test-array ()
  (let ((arr1 (make-array 
               200000 
               :element-type 'single-float 
               :initial-element 1.0)))
    (dotimes (x 200000) (setf (aref arr1 x) 0.0))))

(time (test-array))

结果是:

Evaluation took:
  0.000 seconds of real time
  0.000119 seconds of total run time (0.000112 user, 0.000007 system)
  100.00% CPU
  235,760 processor cycles
  800,016 bytes consed
  0.000140 seconds of total run time (0.000132 user, 0.000008 system)

声明数组元素的类型似乎帮助不大(单精度浮点数将consing从 1,600,000降至800,000)。性能分析并未显示额外信息。

解决方案

问题在于你对“consing”是什么意思的误解。它指的是任何动态内存分配,而不仅仅是cons cell。在这种情况下,你是在为数组本身分配内存。单精度浮点数组的每个元素占用4 字节,200,000 × 4 = 800,000字节。其余的16字节来自数组元数据的开销。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章