Delphi中的递归类实例大小

Posted

技术标签:

【中文标题】Delphi中的递归类实例大小【英文标题】:Recursive Class Instance Size in Delphi 【发布时间】:2009-01-27 08:07:12 【问题描述】:

有没有办法在 Delphi 中获取类实例的实际大小?

我知道 TObject 类的 InstanceSize 方法,但该方法不会为对象成员递归调用自身。例如,假设我们有两个类:

type MyClass1 = class
  private
    myVar1 : integer;
    myVar2 : integer;
end;

type MyClass2 = class
  private
    myOtherVar1 : integer;
    myOtherVar2 : MyClass1;
end;

对于这段代码,MyClass1 的长度为 12 个字节(每个整数 4 个字节加上 4 个用于类开销),MyClass2 的长度为 24 个字节(4 个字节用于类开销,12 个字节来自 myOtherVar2,另外 4 个字节对于 myOtherVar1 整数)。由于 myOtherVar2 被解释为指针(4 字节)而不是类引用,因此使用 InstanceSize 将导致每个 12 字节。

有没有办法获得类的总大小,包括它对其他类实例的引用?

【问题讨论】:

好问题!每个人都使用 TObject,但没有人知道它实际占用了多少内存。 【参考方案1】:

构造一个 MyClass1 对象和一百万个 MyClass2,这样每个 MyClass2 都指向同一个 MyClass1。

每个 MyClass2 占用多少内存? 12.000012 字节?

循环列表占用多少内存?无限大,你可以永远追逐指针吗?

在带有指针的语言中,朴素的递归大小算法通常没有用处。您需要编写自己的算法,该算法体现了有关您如何使用对象的聚合/组合、共享和递归引用的知识。

【讨论】:

或者换一种说法:你想去多深?如果ObjectA引用ObjectB,ObjectB引用ObjectC,ObjectC引用.......那么ObjectA真正的“内存使用”是什么?【参考方案2】:

不,你想要的不存在。如果你想要这样的东西,你应该自己写。

【讨论】:

【参考方案3】:

有没有办法得到总大小 类的,包括其引用 到其他类实例?

你刚才说了。引用是一个指针;它的大小是 4 个字节。 InstanceSize 返回的值是为类的实例数据分配的字节数。

例如,

myOtherVar2 可能为零。但是 nil 指针值仍然会占用 4 个字节的内存。

【讨论】:

【参考方案4】:

要找出它使用了多少内存,您可以让对象不被释放并让 FastMM 告诉您泄漏的大小。

【讨论】:

【参考方案5】:

听起来您想计算对象使用的内存。

如果你需要这样做,你可以检查 FastMM 是如何做的,并且可能会在你的类型的对象被创建时挂钩你的过程。

很多工作目标不明确;你最好在开始之前有充分的理由。

【讨论】:

以上是关于Delphi中的递归类实例大小的主要内容,如果未能解决你的问题,请参考以下文章

delphi 面向对象实用技能教学一(递归)

JavaEE基础(二十三)/递归

Java File 类 文件的常用操作(递归遍历所有文件,统计文件大小,删除文件)

SQL 和 Delphi:从表中创建树的递归机制

Python入门之经典函数实例——第1关:递归函数 - 汉诺塔的魅力

Python入门之经典函数实例——第1关:递归函数 - 汉诺塔的魅力