pascal中使用的集合的实现是什么?

时间:2015-01-12 07:29:29

标签: set time-complexity pascal fpc

我想知道语言提供的pascal中set类型的实际实现。特别是,我想知道freepascal运行时库中使用的那个,但我对任何pascal实现感兴趣。

我关心它的运行时复杂性。 Disjoint-set data structure的最佳实现位于O(log*n),我想知道pascal实现是否有这个。

fpc rtl的文档可以在这里找到:ftp://ftp.freepascal.org/pub/fpc/docs-pdf/rtl.pdf,但它太大(> 1700页),因为它不知道它是否在那里。 The freepascal wiki doesn't shed any light on this

2 个答案:

答案 0 :(得分:2)

根据this explanation,Pascal在内部将集合表示为位串。但是,该文章显然没有提到Pascal的具体实现。在this documentation中,还指出位串用于表示。更确切地说,this documentation明确提到32个字节用于存储集合。

答案 1 :(得分:1)

Free Pascal语言文档是“reference”指南,rtl是运行时指南。编译器选项和指令在程序员指南中,请参阅下面的$ pack *链接。

设置是位域,根据选项的不同而不同。 (例如$packset$packenum),最大大小为256位,32字节(这是旧的TP限制)。

在(obj)FPC模式下的IIRC,使用wordsize进行增长,并且在具有字节大小的粒度的Delphi模式下进行增长,但这有点x86为中心。但是,大小= 3字节是不可能的,并且将向上舍入为4。

下限始终为0,因此一组8..10是2个字节(0..15),即使它只能容纳3个值(8,9,10)。

除此之外,还有一个小端和大端问题。在大端系统上,您无法按字节顺序和字面顺序访问设置字段。 Afaik FPC主要以字面方式访问它们,但是我在上次检查时已经有一段时间了。