【发布时间】:2010-10-21 15:47:16
【问题描述】:
在Delphi中,如果我有一个变量myObject : MyClass,而MyClass有一个属性是一个包含300个整数的定长数组,什么时候分配它的内存?
- 什么时候进入myObject的范围?
- 当我调用
myObject := MyClass.Create;(构造函数)时?
【问题讨论】:
标签: delphi
在Delphi中,如果我有一个变量myObject : MyClass,而MyClass有一个属性是一个包含300个整数的定长数组,什么时候分配它的内存?
myObject := MyClass.Create;(构造函数)时?【问题讨论】:
标签: delphi
固定长度数组是内联分配的,因此它作为 MyClass 实例大小的一部分存在,并且在您调用构造函数时被分配。
【讨论】:
如果你真的是说对象有一个属性,那么根本就没有为它分配空间。属性是其他访问模式(字段或函数)的通用接口。
如果属性由对象的字段支持,那么as Mason explained,该字段作为对象本身的一部分存在;数组的长度直接影响对象的总大小(由TObject.InstanceSize 方法给出)。场有记忆;属性没有。
如果属性由函数支持,则函数的返回值通常会在调用者的堆栈上分配并作为“var”参数传入。该函数填充它并返回给调用者。同样,属性本身没有为其分配内存。
你可以在一个只有四个字节长的对象上拥有一百个属性(这是对象的最小大小)。
但是,如果您实际上是指一个字段,那么它会在调用TObject.NewInstance 期间作为对象的一部分进行分配。该方法作为外部构造函数序言的一部分被调用(与对继承构造函数的任何调用相反)。
【讨论】:
所有属性内容将在实例创建时分配。
在调用 TClassName.Create 之前,堆栈中或声明它的位置只有指针可用:只有 4 个字节。
调用Create方法时,执行TObject.Newinstance方法:
class function TObject.NewInstance: TObject;
begin
Result := InitInstance(_GetMem(InstanceSize));
end;
InstanceSize 方法将返回包含类的所有固定大小(又名静态)属性的大小(以字节为单位)。
您的 300 个整数将通过此 GetMem 调用从堆中检索。需要更多内存(继承的属性和一些默认值,如类类型和 VMT)。
【讨论】: