gpt4 book ai didi

class - Delphi:将数据存储在类与记录中,减少内存使用

转载 作者:行者123 更新时间:2023-12-03 18:46:02 25 4
gpt4 key购买 nike

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

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/31921969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com