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