delphi - 动态结构的大小

标签 delphi struct sizeof

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

我有一个结构

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/

相关文章:

delphi - 使用 Graphics32 创建剪贴蒙版

delphi - 是否可以在delphi 7调试器中查看调用堆栈?

c - 如何使用 sizeof 运算符计算出使用多少字节来存储 C 中的变量?

c - 如何获取内部结构的大小

android - 德尔福 XE5 安卓。如何使用PowerManager.WakeLock?

Delphi - 将两个 exe 转换为一个服务?

c++ - 如何对结构进行位操作?

C初始化结构并通过指针访问

c - C语言中如何初始化结构体指针?

c - 从 size_t 转换为 int 时没有警告