我的Delphi应用程序的内存占用

3
我有一个大型Delphi应用程序,我正在尝试保持内存占用率低。
在我的程序中,我使用了一个组件(Taco)和一个从Taco继承的组件(TBurrito)。现在仅涉及类的内存使用情况而非实例,哪种方案会使用更多内存?
A. 在所有地方都只使用TBurrito组件
还是
B. 使用Taco和TBurrito组件的组合?
我的一个想法是,由于TBurrito继承自Taco,所以类Taco已经存储在内存中,因此使用它不会太大地增加内存占用率。
*注意 - 组件名称并非真正的Taco和Burrito。

1
你是正确的,这两个类的代码和类成员都已包含。(据我所知,除非有一些智能链接可删除未被引用的代码,但我认为这种链接并不存在。) - PA.
1
据我所知,当启用优化时,大多数未使用的代码将被链接器删除。 - user160694
2个回答

6
每个 Burrito 实例占用的内存至少与一个 Taco 实例相同。将 Taco.InstanceSizeBurrito.InstanceSize 中减去,以了解更多信息。
仅使用 Burrito 不会节省任何内存;即使您没有那个确切类的实例,Taco 的定义仍然存在,因为至少 Burrito.ParentClass 仍需要引用它。
使用最小的组件来满足您的需求,但除非 Burrito 相对于 Taco 很大,或者您有大量的 Burrito 实例可以改为是 Taco 实例,否则您可能不会在内存使用方面看到太多总体效果。这将来自于避免加载整个表单,或仅加载文件的一部分而不是整个文件。

5
类只使用其虚方法表(VMT)的内存。除非您实例化一个类,否则它不会占用空间,但是会占用 VMT 的空间,每个类只有一个 VMT。VMT 的大小仅取决于类实际拥有多少虚方法,因为每个虚方法都有一个条目。静态方法在编译时解析,不使用内存空间。 其他 VMT 数据的大小是固定的(尽管在不同版本的 Delphi 中可能不同)。动态方法是为了使 VMT 更小而引入的。这是因为继承一个类将创建一个新的 VMT,其中包含父类的所有虚方法的“插槽”,以及继承类的虚方法。动态方法使用运行时分派代码查找要调用的方法。由于它们有点慢,因此建议仅为覆盖了非常大的父类的几个方法的类使用它们。如果内存不是问题,则没有理由使用它们。 还可能占用内存空间的是 RTTI 信息,尽管我从未调查过它们存储在哪里。 无论如何,如果您使用子类,则还需要其父 VMT,因为子类可能调用继承的方法。但是,除非您使用具有大量虚方法和少量实例的非常大的类,否则我认为应用程序使用的大部分内存将是类实例的内存,而不是类 VMT 的内存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接