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

What is the implementation of sets used in pascal?

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

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

可在此处找到 fpc rtl 的文档:ftp://ftp.freepascal.org/pub/fpc/docs-pdf/rtl.pdf , but it's too large (>1700 pages) for looking for this without knowing if it's even there. The freepascal wiki doesn't shed any light on this

根据this explanation, Pascal internally represents sets as bit strings. However, the article apparently does not refer to a specific implementation of Pascal. In this documentation, it is also stated that bitstrings are used for representation. More precisely, this documentation明确提到32个字节用于存储一组。

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

集合是位域,大小因选项而异。 (例如$packset and $packenum),最大尺寸为 256 位,32 字节(这是旧的 TP 限制)。

IIRC 在 (obj)FPC 模式下,集合随着字大小增长,在 Delphi 模式下随着字节大小的粒度增长,但这有点以 x86 为中心。然而 size=3 字节是不可能的,将向上舍入为 4。

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

除此之外还有一个小端与大端的问题。在大端系统上,您不能按字节和按字交替访问集合字段。 Afaik FPC 主要是按字词访问它们,但我上次检查它已经有一段时间了。