gpt4 book ai didi

delphi - 动态结构的大小

转载 作者:行者123 更新时间:2023-12-03 15:48:56 25 4
gpt4 key购买 nike

这将(希望)很快得到解决,这是我的问题:

我有一个结构

PMacro = ^TMacro;
TMacro = class
Hotkey: Integer;
Command: String;
CTRLMode: boolean;
RepeatInterval: integer;

constructor Create(Hotkey: Integer; Command: String; CTRLMode: boolean; RepeatInterval: integer); overload;
constructor Create; overload;
procedure Execute;
end;

我需要获取它的大小(通过 TFileStream 保存)。此类的实例存储在其他位置的列表中,这是我的保存例程:

Stream:=TFileStream.Create(FileName,fmCreate or fmOpenWrite);
for i := 0 to Macros.Count-1 do
begin
Macro:=TMacro(Macros[i]);
Size:=sizeof(Macro);
Stream.Write(size,SizeOf(integer));
Stream.Write(Macro,sizeof(Macro));
end;

SizeOf(Macro) 返回 4 个字节,这将是指针,但我需要特定实例占用的实际空间。我想到的第一件事是获取Length(Command),因为它是一个返回其指针大小的动态结构。但这意味着有类似 SizeOf(Integer)+Length(Command)+SizeOf(boolean)+... 的东西,但这不利于 TMacro 结构的进一步扩展。

那么,有没有办法获取包含动态类型的结构的大小?

谢谢各位的解答

最佳答案

如果要获取 TMacro 的大小,请调用 InstanceSize 方法。但这不会帮助您将其 block 写入流,并且它不会更改以包含字符串的大小,因为字符串是引用类型。

你不能像那样 block 写入你的 TMacro 结构。首先,它是一个类,而不是一条记录,这意味着它包含一个您不想保存的“神奇”字段(或者其中两个,如果您使用的是 Delphi 2009 或更高版本)。其次,即使它是一条记录,它仍然包含引用类型(字符串),因此数据不会内联存储在 TMacro 中;它存储在堆上并且必须单独访问。

如果您需要实现序列化,可以通过几种不同的方式来实现。要么创建一对方法,如下所示:

procedure Load(savefile: TStream); //can also be implemented as a constructor
procedure Save(savefile: TStream);

然后将它们实现为逐一读取/写入每个字段,或者使用某种带有 RTTI 的通用序列化器。在 Delphi 2010 中编写起来要容易得多,因为它具有更广泛的 RTTI 功能集。

关于delphi - 动态结构的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5914165/

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