当应用程序运行时,我有很多数据要在内存中存储,读取和修改。可以将数据与一棵树进行比较,在该树中,每个节点都由有限数量的字符串和整数描述,并且具有很多子元素。
当前,数据是使用类/对象存储的,例如

TRootElement = class
  fName, fDescription: string;
  fPos: integer;
  /// etc
end;

fDocs: TObjectList; //list of TVariable = class(TRootElement)
fClasses: TObjectList; // list of TClass=class(TRootElement)

当前程序消耗的内存是 Not Acceptable ,因此我正在寻找解决方案以限制它。

我的问题是:如果我用一个基于记录的结构替换当前的,基于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;

我应该用指向下一个/上一个元素的指针替换TList吗?由于我从不访问按索引列出的元素,因此我总是循环遍历整个列表,这样做并不难……但是,如果没有必要,我想避免使用它。

谢谢!

最佳答案

将类更改为记录会减少内存使用量,但随着类或记录中字段数量的增加,节省的意义会降低。一个类和相应记录之间的大小差异正好是四个字节,这说明了一个类拥有但记录中不存在的 VMT pointer。当您考虑权衡时,这种差异通常可以忽略不计:为了节省四个字节,您放弃了继承、多态、数据隐藏和其他面向对象的特性。 (其中一些可能会通过 Delphi 的新“方法记录”得到缓解,但如果您只有 Delphi 2005,那么您还没有该功能。)

事实上,如果这四个字节真的对你的程序产生了影响,那么你可能有一个更大的问题需要解决。只需向树中添加另一个节点,就可以消除四字节的节省。有了足够大的数据集,您将任何一个节点制作成多小都无关紧要,因为无论如何您都无法将它们全部保存在内存中。您需要研究某种缓存方案,因此只有一些节点保存在内存中,其余的保存在其他地方,例如文件或数据库中。

如果您用节点的双向链表替换当前列表,您可能会看到内存使用量增加,因为现在您的每个节点都在跟踪其下一个和前一个邻居,而在 TObjectList 自己管理所有这些之前。

关于class - Delphi:将数据存储在类与记录中,内存使用量减少,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1983506/

10-12 15:05
查看更多