Delphi中的递归类实例大小

时间:2009-01-27 08:07:12

标签: delphi memory size

有没有办法在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个字节lengh(4个字节用于类开销,12个字节来自myOtherVar2,另外4个字节)对于myOtherVar1整数)。由于myOtherVar2被解释为指针(4个字节)而不是类引用,因此使用InstanceSize会导致每个字节有12个字节。

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

5 个答案:

答案 0 :(得分:16)

构造一个MyClass1对象和一百万个MyClass2,使每个MyClass2指向相同的MyClass1。

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

循环列表需要多少内存?无限,因为你可以永远追逐指针?

在具有指针的语言中,一般的递归大小算法无用。您需要编写自己的算法,该算法包含有关特定于您如何使用对象的聚合/组合,共享和递归引用的知识。

答案 1 :(得分:2)

  

有没有办法获得总大小   该类包括其参考   到其他类实例?

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

例如,

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

如果您需要这样做,您可以检查FastMM的工作方式,并且可以在创建类型的对象时挂钩您的过程。

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