我正在尝试优化 Delphi 类的大小,以便它们占用尽可能少的内存,因为我创建了大量的类。
问题是,课程本身很小,但并没有占据我预期的空间。例如,如果我有
type MyClass = class
private
mMember1 : integer;
mMember2 : boolean;
mMember3 : byte;
end;
我希望它使用 6 个字节,但是,由于对齐,它最终使用 12 个字节,也就是说布尔值使用 4 个字节而不是 1 个字节......字节字段也是如此......
对于记录,您可以使用 {$A1} 指令或将其声明为打包记录,以使其仅使用所需的内存。
有什么办法可以通过类来做同样的事情吗? (也许有一些关于如何正确重写 NewInstance 类方法的教程?)
Edit:好吧,稍微解释一下我在做什么......
首先,实际类大小约为 40 个字节,包括 VMT 和接口指针占用的空间。
这些类都继承自 RefCounting 基类,其大小为 8 字节(整数 FRefCount 和一些允许引用计数的方法),并且它们必须支持接口(因此根本不使用打包记录)。
这些对象被传递并被转换为多个对象,而处理程序不知道它们得到了什么。例如,我有一个接收项目列表并执行类似操作的类:
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。