3

我有一个大型的 delphi 应用程序,我试图保持低内存占用。

在我的程序中,我使用了一个组件(Taco)和一个从 taco 继承的组件(TBurrito)。现在只关注类的内存使用而不是实际实例,哪种情况使用更多内存?

A. 在任何地方都只使用 TBurrito 组件

或者

B. 使用 Taco 和 Tburrito 组件的组合?

我的一个想法是,由于 TBurrito 继承了 Taco,所以 Taco 类已经存储在内存中,因此使用它不会增加太多内存占用。

*注意 - 组件名称并不是真正的 Taco 和 Burrito。

4

2 回答 2

6

的每个实例Burrito将占用至少与 的实例一样多的内存Taco。减去Taco.InstanceSizeBurrito.InstanceSize找出更多。

独占使用Burrito不会为您节省任何内存;的定义Taco仍然存在,即使您没有该确切类的实例,因为至少Burrito.ParentClass仍然需要引用它。

使用满足您需求的最小组件,但除非与此相比Burrito很大或者Taco您有大量Burrito可能是Taco实例的实例,否则您可能不会看到对内存使用的总体影响。这将来自于避免加载整个表单,或者只加载文件的一部分而不是整个文件。

于 2010-12-02T13:32:54.683 回答
4

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

于 2010-12-02T14:26:36.627 回答