【发布时间】:2017-07-24 11:01:39
【问题描述】:
位向量在 sbcl 中使用了多少内存?
每比特消耗 1 比特内存吗? 每位花费 1 字节内存吗? 每位花费1个字内存吗?
【问题讨论】:
标签: vector common-lisp sbcl memory-size
位向量在 sbcl 中使用了多少内存?
每比特消耗 1 比特内存吗? 每位花费 1 字节内存吗? 每位花费1个字内存吗?
【问题讨论】:
标签: vector common-lisp sbcl memory-size
SBCL 中的位向量以每位一位的方式高效存储,加上每个向量的一些小的管理开销。
他们在bitwise operations 也非常高效,一次工作一个完整的单词。例如,64 位平台上的 BIT-XOR 将同时处理位向量的 64 位。
【讨论】:
从 Common Lisp 可以询问是否有位向量的特殊数组类型:
* (UPGRADED-ARRAY-ELEMENT-TYPE 'bit)
BIT
这意味着当您请求位向量时,CL 会为您提供位向量,而不是具有 8 位元素的向量。
SBCL 中对象的大小
Alastair Bridgewater 提供此函数是为了尝试在 SBCL 中获取对象的“大小”:
(defun get-object-size/octets (object)
(sb-sys:without-gcing
(nth-value 2 (sb-vm::reconstitute-object
(ash (logandc1 sb-vm:lowtag-mask
(sb-kernel:get-lisp-obj-address object))
(- sb-vm:n-fixnum-tag-bits))))))
* (get-object-size/octets (make-array 40 :element-type 'bit :initial-element 1))
32
* (get-object-size/octets (make-array 400 :element-type 'bit :initial-element 1))
80
* (get-object-size/octets (make-array 4000 :element-type 'bit :initial-element 1))
528
【讨论】: