提问人:Akronix 提问时间:1/12/2015 最后编辑:Akronix 更新时间:10/23/2016 访问量:805
pascal 中使用的集合的实现是什么?
What is the implementation of sets used in pascal?
问:
我想知道语言提供的 pascal 中 set 类型的实际实现。特别是,我想知道 freepascal 运行时库中使用的那个,但我对任何 pascal 实现都感兴趣。
我关心它的运行时复杂性。Disjoint-set 数据结构的最佳实现在 O(log*n) 中,我想知道 pascal 实现是否有这个。
fpc rtl 的文档可以在这里找到: ftp://ftp.freepascal.org/pub/fpc/docs-pdf/rtl.pdf ,但它太大了(>1700 页),无法在不知道它是否存在的情况下寻找它。freepascal wiki 对此没有任何说明。
答:
根据这种解释,Pascal 在内部将集合表示为位字符串。然而,这篇文章显然没有提到 Pascal 的具体实现。在本文档中,还指出位字符串用于表示。更准确地说,本文档明确提到了 32 个字节用于存储集合。
评论
set of 0..10
Free Pascal 语言文档是“参考”指南,rtl 是运行时指南。编译器选项和指令在程序员指南中,请参阅下面的 $pack* 链接。
集是位域,大小因选项而异。(例如 $packset 和 $packenum),最大大小为 256 位,32 字节(这是旧的 TP 限制)。
IIRC 在 (obj)FPC 模式下,集合随字大小增长,在 Delphi 模式下以字节大小的粒度增长,但这有点以 x86 为中心。但是,size=3 字节是不可能的,并且将四舍五入为 4。
下限始终为 0,因此一组 8..10 是 2 个字节 (0..15),即使它只能容纳 3 个值 (8,9,10)。
除此之外,还有一个小端序与大端序的问题。在大端系统上,您不能交替按字节和按字访问集合字段。Afaik FPC 主要以单词方式访问它们,但我上次检查是不久前。
评论
Error: This kind of property can't be published