【问题标题】:Delphi object memory allocationDelphi 对象内存分配
【发布时间】:2010-10-21 15:47:16
【问题描述】:

在Delphi中,如果我有一个变量myObject : MyClass,而MyClass有一个属性是一个包含300个整数的定长数组,什么时候分配它的内存?

  • 什么时候进入myObject的范围?
  • 当我调用myObject := MyClass.Create;(构造函数)时?

【问题讨论】:

    标签: delphi


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果你真的是说对象有一个属性,那么根本就没有为它分配空间。属性是其他访问模式(字段或函数)的通用接口。

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

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

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

        【讨论】:

        • 错了。一个对象的所有字段都会在创建实例时分配。对于属性而言,这不一定是正确的,因为它可能具有不需要在实例创建时分配任何内存的 Getter 和 Setter 方法。
        猜你喜欢
        • 2015-10-15
        • 2014-03-17
        • 2016-04-01
        • 2013-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多