当前位置:  开发笔记 > 编程语言 > 正文

在Delphi中优化类大小.有类似"打包课"的东西吗?

如何解决《在Delphi中优化类大小.有类似"打包课"的东西吗?》经验,为你挑选了1个好方法。

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

问题是,班级本身很小但他们没有占据我期待的空间.例如,如果我有

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

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

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

有什么方法可以用类做同样的事情吗?(也许有关如何正确覆盖NewInstance类方法的一些教程?)

编辑:好的,关于我正在做什么的一点解释......

首先,实际类大小类似于40个字节,包括VMT占用的空间和接口指针.

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

这些对象被传递并被投射到几个东西,而不知道他们得到了什么.例如,我有一个接收TItems列表的类,并执行以下操作:

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

然后另一个处理程序可以检查其他接口

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

这样每个处理程序对List的处理方式都不同......

关于如何获得类的总大小我正在使用修改后的内存管理器,以便我可以跟踪"真实"内存管理器用于该类的内存量.通过这种方式,我非常自信的实例没有被打包.

最后这是在Delphi 7中.我试图使用{$ A1}预编译器指令没有运气,字段以任何方式对齐,并且我可能有几百万个实例作为最坏的情况,因此节省6个字节可能导致几个MB被保存.



1> Gerry Coll..:

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

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;


+1,但如果OP不需要所有单个数据元素的完整范围,则应使用http://stackoverflow.com/questions/282019中概述的技术,并将布尔值折叠为其中一个其他数据元素,在进程中保存另一个字节.在现代处理器上,以更多的cpucycles为代价的内存消耗更少,几乎每次都能获得性能.
另请注意,您可以将整个打包记录放入TMyClass,创建一个私有的未命名类型(因为它是一个实现细节).
推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有