gpt4 book ai didi

delphi - 枚举集大小(x64)

转载 作者:行者123 更新时间:2023-12-03 14:53:36 31 4
gpt4 key购买 nike

我发现 SizeOf(set) 在 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.

最佳答案

回答你的问题。我在 Embarcadero 网站上找不到任何有关差异或更改行为的编译器指令的信息。我的研究表明以下内容:

集合在 32 位中具有以下大小(以字节为单位):

  • 最多 8 个元素 - 1 字节
  • 9 到 16 个元素 - 2 字节
  • 17 到 32 个元素 - 4 字节

从这一点开始,它会根据需要添加字节,一次一个。因此 33 到 40 个元素使用 5 个字节,41 到 48 个元素使用 6 个字节。

在 64 位模式下,情况略有不同:

  • 最多 8 个元素 - 1 字节
  • 9 到 16 个元素 - 2 字节
  • 17 到 32 个元素 - 4 字节
  • 33 到 64 个元素 - 8 字节

从这一点开始,它会根据需要添加字节,一次一个。因此 65 到 72 个元素使用 9 个字节,73 到 80 个元素使用 10 个字节。

要解决此问题,您需要在 TWriter.WritePropertyTReader.ReadSet 中使用类似 WriteSet 的内容,或者您​​也可以做这样的事情:

procedure SaveSetToStream(aStream: TStream; const aSet: TProperties1);
var
streamData: array[0..7] of byte;
begin
Assert(SizeOf(aSet) <= SizeOf(streamData), 'Set is too large to save. Increase the array length.');
FillChar(streamData, SizeOf(streamData), 0);
Move(aSet, streamData, SizeOf(aSet));
aStream.Write(streamData, SizeOf(streamData));
end;

function ReadFromStream(aStream: TStream): TProperties1;
var
streamData: array[0..7] of byte;
begin
Assert(SizeOf(Result) <= SizeOf(streamData), 'Set is too large to load. Increase the array length.');
aStream.Read(streamData, SizeOf(streamData));
Move(streamData, Result, SizeOf(Result));
end;

关于delphi - 枚举集大小(x64),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30336620/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com