有没有办法在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个字节。
有没有办法获得类的总大小,包括对其他类实例的引用?
答案 0 :(得分:16)
构造一个MyClass1对象和一百万个MyClass2,使每个MyClass2指向相同的MyClass1。
每个MyClass2占用多少内存? 12.000012字节?
循环列表需要多少内存?无限,因为你可以永远追逐指针?
在具有指针的语言中,一般的递归大小算法无用。您需要编写自己的算法,该算法包含有关特定于您如何使用对象的聚合/组合,共享和递归引用的知识。
答案 1 :(得分:2)
有没有办法获得总大小 该类包括其参考 到其他类实例?
你刚才这么说。引用是一个指针;它的大小是4个字节。 InstanceSize返回的值是为类的实例数据分配的字节数。
例如,myOtherVar2可能是零。但是nil指针值仍然会占用4个字节的内存。
答案 2 :(得分:2)
找出它使用了多少内存,你可以让对象不被释放&让FastMM告诉你泄漏的大小。
答案 3 :(得分:1)
不存在你想要的东西。如果你想要这样的东西,你应该自己写。
答案 4 :(得分:1)
听起来您想要计算对象使用的内存。
如果您需要这样做,您可以检查FastMM的工作方式,并且可以在创建类型的对象时挂钩您的过程。
很多目标不明确的工作;在开始之前你最好有充分的理由。