Delphi对象内存分配

时间:2010-10-21 15:47:17

标签: delphi

在Delphi中,如果我有一个变量myObject : MyClass,并且MyClass的属性是一个固定长度的数组,其中包含300个整数,那么它的内存何时会被分配?

  • 何时输入myObject的范围?
  • 当我打电话给myObject := MyClass.Create;(构造函数)?

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

如果您的意思是该对象具有属性,则根本不会为其分配任何空间。属性是一些其他访问模式的通用接口,无论是字段还是函数。

如果属性由对象的字段支持,则as Mason explained,该字段作为对象本身的一部分存在;数组的长度直接影响对象的总大小(由TObject.InstanceSize方法给出)。该领域有记忆;该物业没有。

如果属性由函数支持,则函数的返回值通常在调用者的堆栈上分配,并作为“var”参数传入。该函数填充它并返回给调用者。同样,该属性本身没有为其分配内存。

对象上可以有一百个属性,只有四个字节长(这是对象的最小大小)。

但是,如果您实际上是指字段,则在调用TObject.NewInstance期间将其分配为对象的一部分。该方法被称为外部构造函数的序言的一部分(与对继承的构造函数的任何调用相反)。

答案 2 :(得分:0)

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

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

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

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

InstanceSize方法将返回包含类的所有固定大小(aka静态)属性的大小(以字节为单位)。

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