在Delphi中优化类大小.有类似“打包课”的东西吗?
我正在尝试优化我的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被保存. 解决方法
您可以将打包记录用作对象的字段:
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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |