mig*_*jek 4 memory delphi oop class
在应用程序运行时,我在内存中存储,读取和修改了大量数据.可以将数据与树进行比较,其中每个节点由有限数量的字符串和整数描述,并且具有相当多的子元素.目前,数据是使用类/对象存储的,例如
TRootElement = class
fName, fDescription: string;
fPos: integer;
/// etc
end;
fDocs: TObjectList; //list of TVariable = class(TRootElement)
fClasses: TObjectList; // list of TClass=class(TRootElement)
Run Code Online (Sandbox Code Playgroud)
目前程序消耗的内存是不可接受的,因此我正在寻找限制它的解决方案.
我的问题是:如果我将基于记录的当前,OOP和基于对象的架构替换为一个,那么消耗是否会显着降低? 例如,一般记录可能包含:
TRootElement = record
fType: TElemType; // enum: root, variable, class, etc ...
fName, fDesc: string;
// all the fields used by root elem and it's descendants there
end;
Run Code Online (Sandbox Code Playgroud)
我应该用指向下一个/前一个元素的指针替换TList吗?因为我从来没有按索引访问列表元素,所以我总是在整个列表中循环,这应该不是很难...但是如果没有必要的话我想避免它.
谢谢!米
Rob*_*edy 14
将类更改为记录将减少内存使用量,但随着类或记录中字段数量的增加,节省的重要性会降低.类和相应记录之间的大小差异恰好是四个字节,它考虑了一个类保存但在记录中不存在的VMT指针.当您考虑权衡时,这种差异通常可以忽略不计:为了节省四个字节,您放弃了继承,多态,数据隐藏和其他面向对象的功能.(其中一些可能会通过Delphi的新"记录方法"来缓解,但如果你只有Delphi 2005,那么你还没有这个功能.)
实际上,如果这四个字节确实对您的程序产生了影响,那么您可能需要解决更大的问题.只需在树中添加另一个节点即可消除四字节的节省.使用足够大的数据集,无论您制作任何一个节点有多小都无关紧要,因为无论如何您都无法将它们全部保存在内存中.您需要调查某种缓存方案,因此只有一些节点保留在内存中,其余节点保存在其他位置,例如文件或数据库中.
如果用双重链接的节点列表替换当前列表,您可能会看到内存使用量增加,因为现在每个节点都在跟踪其下一个和前一个邻居,而在TObjectList管理所有这些节点之前.