delphi - 优化 Delphi 中的类大小。有类似 "packed classes"的东西吗?

标签 delphi optimization memory

我正在尝试优化 Delphi 类的大小,以便它们占用尽可能少的内存,因为我创建了大量此类类。

问题是,类(class)本身很小,但它们并没有占据我预期的空间。例如,如果我有

type MyClass = class
  private
    mMember1 : integer;
    mMember2 : boolean;
    mMember3 : byte;
end;

我希望它使用 6 个字节,但是,由于对齐,它最终使用 12 个字节,即 bool 值使用 4 个字节而不是 1 个字节...字节字段也是如此...

对于记录,您可以使用 {$A1} 指令或将其声明为打包记录,以使其仅使用所需的内存。

有没有办法用类来做同样的事情? (也许有一些关于如何正确重写 NewInstance 类方法的教程?)

编辑:好的,对我正在做的事情做一些解释...

首先,实际类大小约为 40 个字节,包括 VMT 和接口(interface)指针占用的空间。

这些类都继承自 RefCounting 基类,其大小为 8 字节(整数 FRefCount 和一些允许引用计数的方法),并且它们必须支持接口(interface)(因此根本不使用打包记录)。

这些对象被传递并被转换为多个对象,而处理程序不知道它们得到了什么。例如,我有一个接收 TItems 列表并执行类似操作的类:

if Supports(List[i], IValuable, IValInstance) then
  Eval(IValInstance.Value);

然后另一个处理程序可能会检查其他接口(interface)

If Supports(List[i], IStringObject, IStringInstance) then
  Compose(IStringInstance.Value)

这样每个处理程序都会对列表进行不同的处理...

关于如何获取类的总大小,我正在使用修改后的内存管理器,以便我可以跟踪“真实”内存管理器为该类使用了多少内存。这样我就非常有信心实例没有被打包。

最后这是在 Delphi 7 中。我尝试使用 {$A1} 预编译器指令,但没有成功,字段以任何方式对齐,并且在最坏的情况下我可能有数百万个实例,因此节省 6 个字节可以结果节省了几MB。

最佳答案

您可以使用打包记录作为对象的字段:

type
  TMyRecord = packed record
    Member1 : integer;
    Member2 : boolean;
    Member3 : byte;
  end;

  TMyClass = class
  private
    FData : TMyRecord;
   function GetMember1 : Integer;
  public
    property Member1 : Integer read GetMember1;
    // Later versions of Delphi allow "read FData.Member1;", not sure when from
  end;

function TMyClass.GetMember1 : integer;
begin
  result := FData.Member1;
end;

关于delphi - 优化 Delphi 中的类大小。有类似 "packed classes"的东西吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/831099/

相关文章:

delphi - 如何将字段接口(interface)注入(inject)到对象中

MySQL - 不排序的组顺序

database - 随机选择尚未在连接表中的实体

memory - 什么是计算机科学中的分段和分页?

memory - 绘制进程的内存使用情况

Java 与 Delphi 5

delphi - Delphi中如何通过ToolsAPI获取模块的结构?

delphi - 在delphi中发送带有rtf文本的电子邮件

optimization - DirectX - 停止渲染以减少使用的资源量?

algorithm - 存储概率分布而不保存单个值