【发布时间】:2015-07-31 22:19:30
【问题描述】:
我发现 SizeOf(set) i 在 32 位和 64 位中不同,下面的示例显示 32 位为 5 个字节,64 位为 8 个字节。但我没有发现任何关于 64 位 SizeOf(sets) 变化的信息。是否有任何关于它的 Embarcadero 文档或编译器指令可以在 32 位和 64 位上获得类似的结果。
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses System.SysUtils;
type
{ Enumeration of properties}
TProperty1 = (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14,
p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28,
p29, p30, p31, p32, p33, p34, p35, p36, p37);
TProperties1 = set of TProperty1;
begin
WriteLn(SizeOf(TProperties1));
ReadLn;
end.
【问题讨论】:
-
为什么这对你很重要?似乎 64 位编译器使用 64 位整数作为集合,但 32 位编译器完全做了其他事情。天知道是什么。看看编译器对较小的基本类型集做了什么会很有趣。我确定没有文档,也没有编译器开关。你必须忍受这个。
-
我通过以下方式将集合保存到流中 Stream.Write(set, SizeOf(set))。所以 32 位和 64 位应用程序创建不同的流。我检查了一个较小的集合(最多 32 个元素),它们的大小是相等的。嘿,我检查了一个包含 66 个元素的集合,并且 sizeof 在 32 位和 64 位上为 9。
-
非常相关的问题(几乎是重复的):How to save/load set of types。显示将一组转换为一堆位的各种方法的答案。
-
要保存为二进制文件,你应该只保存足够的字节数,我想当 3 个字节足够时保存 4 个字节是没有意义的。因此,我将持久性基于基本枚举的大小。并希望您永远不要更改基本枚举!!!
-
FWIW;文档 (docwiki.embarcadero.com/RADStudio/XE8/en/…) 说:“如果可能,编译器会将集合存储在 CPU 寄存器中”。在 64 位中,寄存器可以达到 64 位。
标签: delphi enums 64-bit 32bit-64bit 32-bit