Delphi对象内存分配

5
在Delphi中,如果我有一个变量myObject:MyClass,并且MyClass有一个属性,它是一个包含300个整数的固定长度数组,那么什么时候会为它分配内存?
  • 当进入myObject的作用域时?
  • 当我调用myObject:= MyClass.Create;(构造函数)时?
答案是在创建myObject实例时分配内存,也就是在调用MyClass.Create时。
3个回答

6

固定长度数组是内联分配的,因此它作为MyClass实例大小的一部分存在,并且在调用构造函数时进行分配。


5
如果你真的指的是对象有一个属性,那么根本不会为其分配任何空间。属性是一些其他访问模式的通用接口,可以是字段或函数。
如果该属性由对象的字段支持,则如Mason所解释的,该字段作为对象本身的一部分存在;数组的长度直接影响对象的总大小(由TObject.InstanceSize方法给出)。该字段具有内存,而属性没有。
如果该属性由函数支持,则函数的返回值通常在调用者的堆栈上分配并作为“var”参数传递。函数填充它并返回给调用者。同样,属性本身没有为其分配任何内存。
您可以在仅四个字节长的对象上拥有一百个属性(这是对象的最小大小)。
然而,如果您实际指的是一个字段,则在调用TObject.NewInstance时它将作为对象的一部分分配。该方法作为外部构造函数的序言之一调用(与任何调用继承构造函数的调用相对)。

0

所有属性内容将在实例创建时分配。

TClassName.Create调用之前,在堆栈或声明位置只有指针可用:仅4个字节。

调用Create方法时,将执行TObject.Newinstance方法:

class function TObject.NewInstance: TObject;
begin
  Result := InitInstance(_GetMem(InstanceSize));
end;

InstanceSize方法将返回类的所有固定大小(也称为静态)属性所占用的字节数。

通过此GetMem调用将从堆中检索出您的300个整数。还需要一些内存(继承属性和一些默认值,如类类型和VMT)。


这是错误的。对象的所有字段都将在实例创建时分配。对于属性来说,这并不一定正确,因为它可能具有Getter和Setter方法,在实例创建时不需要分配任何内存。 - dummzeuch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接