在Delphi中,如果我有一个变量myObject : MyClass
,并且MyClass
的属性是一个固定长度的数组,其中包含300个整数,那么它的内存何时会被分配?
myObject := MyClass.Create;
(构造函数)?答案 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)。