我想尽可能地优化我的Delphi类的大小,使它们占用尽可能少的内存,因为我正在创建大量的类。
问题是,这些类本身很小,但它们占据的空间并不是我预期的。例如,如果我有:
type MyClass = class
private
mMember1 : integer;
mMember2 : boolean;
mMember3 : byte;
end;
我期望它使用6个字节,但由于对齐的原因,它最终使用了12个字节,这意味着布尔值使用了4个字节而不是1个字节...字节字段同样如此...
对于记录,您可以使用{$A1}指令或声明为紧凑记录,以使其只使用所需的内存。
有没有办法用类做同样的事情?(也许有关正确重写NewInstance类方法的一些教程?)
编辑:好吧,稍微解释一下我在做什么...
首先,真正的类大小大约是40个字节,包括VMT和接口指针占用的空间。
所有类都继承自一个基本的RefCounting类,其大小为8个字节(整数FRefCount和一些方法,以允许引用计数),并且它们必须支持接口(因此根本不使用紧凑记录)。
这些对象会被传递并转换为多种类型,处理程序不知道它们得到了什么。例如,我有一个类,接收TItems列表,并执行以下操作:
if Supports(List[i], IValuable, IValInstance) then
Eval(IValInstance.Value);
那么,另一个处理程序可能会检查其他接口。
If Supports(List[i], IStringObject, IStringInstance) then
Compose(IStringInstance.Value)
这样每个处理程序都会以不同的方式处理列表...
关于如何获取类的总大小,我使用了一个修改过的内存管理器,以便我可以跟踪“真正”内存管理器为该类使用了多少内存。通过这种方式,我非常有信心实例没有被打包。
最后,这是在Delphi 7中完成的。我尝试使用{$A1}预编译指令,但并没有成功,字段仍然按照任意方式对齐,并且最坏情况下我可能有几百万个实例,因此节省6个字节可以节省数MB。