我有一个大型的Delphi应用程序,我正在尝试保持内存范围较低。

在我的程序中,我使用的是从炸玉米饼继承的组件(Taco)和一个组件(Tburrito)。现在,仅谈论类的内存使用情况,而不是实际实例,哪种情况使用更多内存?

答:只使用到处都是tburrito组件

或者

B.使用炸玉米饼和tburrito组件的组合?

我的一个想法是,由于Tburrito继承了炸玉米饼,因此炸玉米饼已经存储在内存中,因此使用它不会增加内存的足迹。

*注意 - 组件名称并不是炸玉米饼和墨西哥卷饼。

有帮助吗?

解决方案

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

使用 Burrito 完全不会为您保存任何内存;定义 Taco 即使您没有确切的类别的实例,仍然存在,因为至少, Burrito.ParentClass 仍然需要参考它。

使用满足您需求的最小组件,但是除非 Burrito巨大的 相比 Taco 或者您有大量 Burrito 可能是 Taco 相反,您可能不会看到对您的内存使用情况的总体影响。这将来自避免加载整个表格,或者仅加载文件的零件而不是整个内容。

其他提示

课程只需为其VMT使用内存即可。直到您实际实施一个类,它才能占用空间,而是为VMT占用,每个类只有一个VMT。 VMT大小仅取决于类实际具有多少虚拟方法,因为每个虚拟方法都有一个条目。静态方法在编译时间解决,不使用内存空间。其他VMT数据固定在大小上(尽管在不同版本的Delphi中可能有所不同)。引入了动态方法以使VMT较小。这是因为继承一类将创建一个新的VMT,并使用父类的虚拟方法的所有“插槽”以及继承类的类别。动态方法使用运行时调度代码查找要调用的方法。因为它们的使用速度较慢,所以仅建议使用过少数几种非常大的父级方法的课程。如果内存不是问题,则没有理由使用它们。尽管我从未调查它们如何存储在哪里,但也可以使用内存空间的是RTTI信息。无论如何,如果您使用儿童课,也应该需要其父级VMT,因为子类可以调用继承的vmt。但是,除非您使用非常大的类带有许多虚拟方法和很少的实例,否则我猜想您的应用程序使用的大多数内存都将是类实例,而不是类VMT。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top