枚举类型:限制项目数量?

Dav*_*vid 4 delphi

Delphi中对枚举类型中的项目数有限制吗?我需要创建一个可能有几百个项目的枚举类型,并且要确保例如255个项目没有限制.

type 
  TMyType = (mtOne, mtTwo, mtThree, ..., mtThreeHundred);
Run Code Online (Sandbox Code Playgroud)

Bar*_*lly 6

我相信理论上的限制是2 ^ 32项; 但实际上,RTTI生成通常是限制,因为RTTI不能超过65535字节来存储所有内容,包括枚举元素的名称; 名称存储在UTF-8中,所以它不是太糟糕.

另一方面,具有元素显式值的枚举没有完整的RTTI,因此您可以通过这种方式规避限制.这是一个程序,它创建一个包含500,001个枚举元素的源文件,它本身编译:

var
  i: Integer;
begin
  Writeln('type');
  Writeln('  E = (');
  for i := 1 to 500000 do
    Writeln('  x_', i, ' = ', i, ',');
  Writeln('x_last);');
  Writeln('begin');
  Writeln('end.');
end.
Run Code Online (Sandbox Code Playgroud)

该程序的输出需要一些时间来使用dcc32进行编译,因为Delphi编译器使用只有32个桶的哈希表来检查枚举标识符重复项,以及一个只有256个桶用于文件级范围的哈希表(在没有的情况下) of {$SCOPEDENUMS ON})是添加枚举标识符的位置.


spl*_*ash 5

我在德语Delphi书中发现了最多65535个项目.

在对文件进行一些挖掘之后,我找到了相应的部分:

枚举类型

如果枚举的值不超过256且类型在{$Z1}状态(默认值)中声明,则枚举类型将存储为无符号字节.如果枚举类型具有超过256个值,或者在{$Z2}状态中声明了类型,则将其存储为无符号字.如果在{$Z4}状态中声明了枚举类型 ,则将其存储为无符号双字.

所以实际上最多应该有4294967295($FFFFFFFF)个项目.

  • 请记住:枚举几乎可以无限制,但如果您创建一组EnumerationType,则该集合不能超过256个元素.由于枚举通常与集合结合使用,因此将自己限制在集合类型的限制更为实际. (4认同)