Delphi对象内存分配

Delphi对象内存分配,delphi,Delphi,在Delphi中,如果我有一个变量myObject:MyClass,并且MyClass有一个固定长度的数组,其中包含300个整数,那么什么时候会为它分配内存 何时输入myObject的范围 当我调用myObject:=MyClass.Create(构造函数) 固定长度数组是内联分配的,因此它作为MyClass实例大小的一部分存在,并且在调用构造函数时得到分配。如果您真的是指对象具有属性,则根本不会为其分配空间。属性是其他访问模式(字段或函数)的通用接口 如果属性由对象的字段支持,则该字段作为对

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

  • 何时输入myObject的范围
  • 当我调用
    myObject:=MyClass.Create(构造函数)

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

如果您真的是指对象具有属性,则根本不会为其分配空间。属性是其他访问模式(字段或函数)的通用接口

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

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

在一个只有4字节长的对象上可以有100个属性(这是对象的最小大小)


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

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

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

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

class function TObject.NewInstance: TObject;
begin
  Result := InitInstance(_GetMem(InstanceSize));
end;
InstanceSize方法将返回包含类的所有固定大小(也称为静态)属性的大小(以字节为单位)

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

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