Delphi中对枚举类型中的项目数有限制吗?我需要创建一个可能有几百个项目的枚举类型,并且要确保例如255个项目没有限制.
type
TMyType = (mtOne, mtTwo, mtThree, ..., mtThreeHundred);
Run Code Online (Sandbox Code Playgroud)
我相信理论上的限制是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})是添加枚举标识符的位置.
我在德语Delphi书中发现了最多65535个项目.
在对文件进行一些挖掘之后,我找到了相应的部分:
如果枚举的值不超过256且类型在
{$Z1}状态(默认值)中声明,则枚举类型将存储为无符号字节.如果枚举类型具有超过256个值,或者在{$Z2}状态中声明了类型,则将其存储为无符号字.如果在{$Z4}状态中声明了枚举类型 ,则将其存储为无符号双字.
所以实际上最多应该有4294967295($FFFFFFFF)个项目.
| 归档时间: |
|
| 查看次数: |
2434 次 |
| 最近记录: |