我想知道语言提供的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
答案 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主要以字面方式访问它们,但是我在上次检查时已经有一段时间了。