Tim*_*Tim 3 delphi object memory-footprint
我有一个很大的delphi应用程序,我试图保持低内存占用.
在我的程序中,我使用的是一个组件(Taco)和一个继承自taco的组件(TBurrito).现在只关注类的内存使用情况而不是实际实例,哪种情况使用更多内存?
A.到处使用TBurrito组件
要么
B.使用Taco和TBurrito组件的组合?
我的一个想法是,由于TBurrito继承了Taco,因此Taco类已经存储在内存中,因此使用它不会增加内存的占用空间.
*注意 - 组件名称不是真正的Taco和Burrito.
每个实例Burrito
将占用至少与实例一样多的内存Taco
.减去Taco.InstanceSize
从Burrito.InstanceSize
找出多少.
Burrito
专门使用不会为您节省任何内存; Taco
即使你没有那个确切类的实例,它的定义仍然存在,因为,至少Burrito.ParentClass
仍然需要引用它.
使用达到你需要的最小组件,但除非Burrito
是巨大的相比,Taco
或者你有大量的Burrito
实例,可能是Taco
情况相反,你可能不会看到你的内存使用量多的整体效果.这将来自于禁止加载整个表单,或者仅加载文件而不是整个文件.
小智 5
类仅将内存用于其 VMT。在你实际实例化一个类之前,除了VMT之外,它不占用空间,并且每个类只有一个VMT。VMT 大小仅取决于类实际有多少个虚拟方法,因为每个虚拟方法都有一个条目。静态方法在编译时解析,不使用内存空间。其他VMT数据的大小是固定的(尽管在不同版本的Delphi中可能不同)。引入动态方法来保持 VMT 更小。这是因为继承一个类将创建一个新的 VMT,其中包含父类的虚拟方法的所有“槽”以及继承类的虚拟方法。动态方法使用运行时调度代码来查找要调用的方法。由于它们速度较慢,因此仅建议对仅覆盖非常大的父类的少数方法的类使用它们。如果内存不是问题,就没有理由使用它们。RTTI 信息也可以使用内存空间,尽管我从未研究过它们是如何存储在哪里的。无论如何,如果您使用子类,则也应该需要其父类 VMT,因为子类可能会调用继承的类。但除非您使用具有大量虚拟方法和少量实例的非常大的类,否则我猜您的应用程序使用的大部分内存将是类实例的内存,而不是类 VMT。
归档时间: |
|
查看次数: |
398 次 |
最近记录: |