2010-10-21 12 views
5

En Delphi, si tengo una variable myObject : MyClass, y MyClass tiene una propiedad que es una matriz de longitud fija con 300 enteros, ¿cuándo se asignará la memoria para ella?Asignación de memoria de objeto Delphi

  • ¿Cuándo se ingresa el alcance de myObject?
  • ¿Cuándo llamo al myObject := MyClass.Create; (constructor)?

Respuesta

6

Los arreglos de longitud fija se asignan en línea, por lo que existe como parte del tamaño de instancia de MyClass y se asigna cuando se llama al constructor.

4

Si realmente quiere decir que el objeto tiene una propiedad , no se le asigna ningún espacio. Las propiedades son interfaces generalizadas a algún otro modo de acceso, ya sea un campo o una función.

Si la propiedad está respaldada por un campo del objeto, entonces, as Mason explained, el campo existe como parte del objeto en sí; la longitud de la matriz afecta directamente el tamaño total del objeto (como se indica en el método TObject.InstanceSize). El campo tiene memoria; la propiedad no.

Si la propiedad está respaldada por una función, el valor de retorno de la función generalmente se asigna en la pila del llamante y se pasa como un parámetro "var". La función lo llena y regresa a la persona que llama. De nuevo, la propiedad en sí no tiene memoria asignada.

Puede tener un centenar de propiedades en un objeto que tiene solo cuatro bytes de longitud (que es el tamaño mínimo para los objetos).

Si, sin embargo, en realidad se refería a un campo , entonces se asigna como parte del objeto durante la llamada al TObject.NewInstance. Ese método se llama como parte del prólogo del constructor externo (a diferencia de cualquier llamada a constructores heredados).

0

El contenido de todas las propiedades se asignará cuando se cree la instancia.

Antes de la llamada TClassName.Create, solo hay un puntero disponible en la pila o donde se haya declarado: solo 4 bytes.

Cuando se llama al método Create, se ejecuta el método TObject.Newinstance:

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

El método InstanceSize devolverá el tamaño (en bytes) que contiene todas las propiedades de la clase de tamaño fijo (también conocido como estática) .

Tus 300 enteros se recuperarán del montón mediante esta llamada de GetMem. Se necesita un poco más de memoria (propiedades heredadas y algunos valores predeterminados como el tipo de clase y el VMT).

+0

Eso está mal. Todos los * campos * de un objeto se asignarán cuando se cree la instancia. Esto no es necesariamente cierto para una propiedad porque podría tener métodos Getter y Setter que no requieran que se asigne ninguna memoria al momento de la creación de la instancia. – dummzeuch