cons/pair的实现

cons/pair的实现,c,lisp,scheme,C,Lisp,Scheme,在低级语言(如C)中实现Lisp的cons/pair有哪些选项 一种常见的实现是由字段type、car和cdr组成的结构。我知道链表的存储效率不是很高,但是额外的类型字段使存储效率更高 我在维基百科上读到,维基百科习惯于为每个单词添加额外的位来获取类型信息。但是今天的体系结构(x86,ARM)有哪些选项呢?Cons单元格只是我们需要在Lisp中表示的一种数据类型。其他的是数组或向量。串。人物。数字。符号。记录。类的实例 不仅Lisp机器使用标记位。大多数Lisp实现都使用它们 大多数Lisp实现

在低级语言(如C)中实现Lisp的cons/pair有哪些选项

一种常见的实现是由字段typecarcdr组成的结构。我知道链表的存储效率不是很高,但是额外的类型字段使存储效率更高


我在维基百科上读到,维基百科习惯于为每个单词添加额外的位来获取类型信息。但是今天的体系结构(x86,ARM)有哪些选项呢?

Cons单元格只是我们需要在Lisp中表示的一种数据类型。其他的是数组或向量。串。人物。数字。符号。记录。类的实例

不仅Lisp机器使用标记位。大多数Lisp实现都使用它们

大多数Lisp实现只使用每个内存字中的位。不同的Lisp机器在每个字的位数上有所不同。符号36**机器使用36位字。象征主义象牙使用40位字。TI浏览器使用32位字。因此,象征主义使用了不寻常的字号,而TI使用了正常的字号。Symbolics能够通过其40位CPU(16 GB)处理更多内存。一个单词的8位用于标记。Symbolics在表示数据时还进行了各种其他优化(例如,列表可以表示为cdr编码的向量-此技术在当前的Lisp实现中未使用)

今天的大多数CPU都是32位或64位体系结构。这使得一个Lisp单元格中的两个字的大小和位必须适合这些字的大小。fixnum小于32位或64位。fixnum是一个整数,它适合字减去标记位。对于较大的整数,数字需要以不同的方式表示。因此,在64位机器上,完整的64位长数字不能表示为fixnum。Common Lisp提供了有关这些大小的信息。在我的64位LispWorks上,最积极的fixnum是1152921504606846975

CL-USER > MOST-POSITIVE-FIXNUM
1152921504606846975

为标记位浪费额外内存是不寻常的。大多数当前的Lisp实现都必须将标记位放入数据字(32位或64位)。Lisp实现者一直在努力使其尽可能高效。

Cons单元格只是我们需要在Lisp中表示的一种数据类型。其他的是数组或向量。串。人物。数字。符号。记录。类的实例

不仅Lisp机器使用标记位。大多数Lisp实现都使用它们

大多数Lisp实现只使用每个内存字中的位。不同的Lisp机器在每个字的位数上有所不同。符号36**机器使用36位字。象征主义象牙使用40位字。TI浏览器使用32位字。因此,象征主义使用了不寻常的字号,而TI使用了正常的字号。Symbolics能够通过其40位CPU(16 GB)处理更多内存。一个单词的8位用于标记。Symbolics在表示数据时还进行了各种其他优化(例如,列表可以表示为cdr编码的向量-此技术在当前的Lisp实现中未使用)

今天的大多数CPU都是32位或64位体系结构。这使得一个Lisp单元格中的两个字的大小和位必须适合这些字的大小。fixnum小于32位或64位。fixnum是一个整数,它适合字减去标记位。对于较大的整数,数字需要以不同的方式表示。因此,在64位机器上,完整的64位长数字不能表示为fixnum。Common Lisp提供了有关这些大小的信息。在我的64位LispWorks上,最积极的fixnum是1152921504606846975

CL-USER > MOST-POSITIVE-FIXNUM
1152921504606846975

为标记位浪费额外内存是不寻常的。大多数当前的Lisp实现都必须将标记位放入数据字(32位或64位)。Lisp实现者一直在努力使其尽可能高效。

您可以用指针中的标记替换
type
字段

结合使用,您可以将每个堆栈插槽(以及
cons
结构的
car
cdr
字段)减小到
double
的大小


但是,对于每个cons单元格,您仍然会有
malloc
开销(一个或两个单词)。

您可以用指针中的标记替换
类型
字段

结合使用,您可以将每个堆栈插槽(以及
cons
结构的
car
cdr
字段)减小到
double
的大小


但是,对于每个cons单元格,您仍然会有
malloc
开销(一个或两个字)。

您基本上不想实现堆栈数据结构吗?@bitmask我猜在幕后Lisp可以使用堆栈或向量而不是列表,具体取决于情况,但我不确定。@Halst,线性数据结构如何满足要求?这是一对,如果我正确记住我的lisp,这甚至可以循环。任何类型的图形都有可能。我不认为有太多的可能性将其作为
struct
void*[2]
或类似的东西。@JensGustedt我记得在某个地方读到,现代Lisp编译器试图检测何时可以用向量有效地替换列表。虽然它应该是一个合适的列表。难道你基本上不想实现堆栈数据结构吗?@bitmask我想在幕后,Lisp可以使用堆栈或向量而不是列表,这取决于具体情况,但我不确定。@Halst,线性数据结构怎么能满足要求?这是一对,如果我正确记住我的lisp,这甚至可以循环。任何类型的图形都有可能。我不认为有太多的可能性将其作为
struct
void*[2]
或类似的东西。@JensGustedt我记得在某个地方读到,现代Lisp编译器试图检测何时可以用向量有效地替换列表。虽然它应该是一个合适的列表。要添加一些详细信息,标记bi