繁体   English   中英

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

[英]Memory footprint of my delphi application

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

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

A.到处使用TBurrito组件

要么

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

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

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

Burrito每个实例至少会占据Taco实例的记忆。 Burrito.InstanceSize减去Taco.InstanceSize以了解更多内容。

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

使用满足您需求的最小组件,但除非与Taco相比Burrito 很大 ,或者您有大量可能是Taco实例的Burrito实例,否则您可能不会对内存使用情况产生太大影响。 这将来自于禁止加载整个表单,或者仅加载文件而不是整个文件。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM