我有一个很大的delphi应用程序,我试图将内存占用率保持在低水平。
在我的程序中,我使用的是一个组件(Taco)和一个继承自taco的组件(TBurrito)。现在只关注类的内存使用而不是实际的实例,哪种场景使用更多内存?
一个。到处使用TBurrito组件
或
B中。使用Taco和TBurrito组件的组合?
我的一个想法是,由于TBurrito继承了Taco,因此Taco类已经存储在内存中,因此使用它不会增加内存的占用空间。
*注意 - 组件名称不是Taco和Burrito。
答案 0 :(得分:6)
Burrito
的每个实例将占用至少与Taco
的实例一样多的内存。从Taco.InstanceSize
中减去Burrito.InstanceSize
以了解更多信息。
仅使用Burrito
不会为您节省任何内存;即使你没有那个确切类的实例,Taco
的定义仍然存在,因为至少Burrito.ParentClass
仍然需要引用它。
使用满足您需求的最小组件,但除非Burrito
巨大与Taco
相比,否则您可能拥有大量Burrito
个实例取而代之的是Taco
个实例,您可能不会对内存使用情况产生太大影响。这将来自于禁止加载整个表单,或仅加载文件而不是整个文件。
答案 1 :(得分:4)
类只为内存使用VMT。在您实际实例化一个类之前,它不占用空间,而是占用VMT,并且每个类只有一个VMT。 VMT大小仅取决于类实际拥有的虚拟方法的数量,因为每个虚拟方法都有一个条目。静态方法在编译时解析,不使用内存空间。 其他VMT数据的大小是固定的(尽管在不同版本的Delphi中可能会有所不同)。引入动态方法以使VMT更小。这是因为继承一个类将创建一个新的VMT,其中包含父类的虚拟方法的所有“插槽”,以及继承的类。动态方法使用运行时调度代码来查找要调用的方法。因为它们有点慢,所以它们的使用仅建议只覆盖非常大的父类的几个方法的类。如果内存不是问题,则没有理由使用它们。 什么也可以使用内存空间是RTTI信息,虽然我从不调查它们的存储方式。 无论如何,如果你使用子类,也应该需要它的父VMT,因为子类可以调用继承的类。但是除非你使用非常大的类,有很多虚拟方法和很少的实例,我想你的应用程序使用的大部分内存都是类实例,而不是类VMT。