4

有没有办法在 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 个字节。

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

4

5 回答 5

16

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

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

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

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

于 2009-01-27T08:31:33.973 回答
2

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

于 2009-01-27T08:09:34.453 回答
2

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

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

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

于 2009-01-27T12:32:06.780 回答
2

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

于 2009-04-06T19:40:07.967 回答
1

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

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

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

于 2009-01-27T09:45:53.590 回答