delphi - programacion - poo pascal
TamaƱo de instancia de clase recursiva en Delphi (5)
¿Hay alguna forma de obtener el tamaño total de la clase, incluida su referencia a otras instancias de clase?
Usted acaba de decirlo. La referencia es un puntero; su tamaño es de 4 bytes. El valor devuelto por InstanceSize es la cantidad de bytes asignados para los datos de instancia de la clase.
myOtherVar2 podría ser nulo, por ejemplo. Pero el valor del puntero nil ocuparía 4 bytes de memoria.
¿Hay alguna manera de obtener el tamaño real de una instancia de clase en Delphi?
Sé sobre el método InstanceSize de la clase TObject, pero ese método no se invoca recursivamente para los miembros del objeto. Por ejemplo, digamos que tenemos dos clases:
type MyClass1 = class
private
myVar1 : integer;
myVar2 : integer;
end;
type MyClass2 = class
private
myOtherVar1 : integer;
myOtherVar2 : MyClass1;
end;
para este segmento de código, MyClass1 tendrá una longitud de 12 bytes (4 bytes para cada entero más 4 para la sobrecarga de clase) y MyClass2 tendrá una longitud de 24 bytes (4 bytes para la sobrecarga de clase, 12 bytes de myOtherVar2 y otros 4 para myOtherVar1 entero). El uso de InstanceSize dará como resultado 12 bytes para cada uno de ellos, ya que myOtherVar2 se interpreta como un puntero (4 bytes) en lugar de como una referencia de clase.
¿Hay alguna manera de obtener el tamaño total de la clase, incluida su referencia a otras instancias de clase?
Construya un objeto MyClass1 y un millón de MyClass2 de modo que cada MyClass2 apunte al mismo MyClass1.
¿Cuánta memoria toma cada MyClass2? 12.000012 bytes?
¿Cuánta memoria toma una lista circular? Infinity, ya que puedes seguir persiguiendo punteros para siempre.
En los lenguajes con punteros, un ingenuo algoritmo de tamaño recursivo no es útil en general. Necesita escribir su propio algoritmo que incorpore el conocimiento sobre la agregación / composición, el intercambio y las referencias recursivas específicas de cómo está utilizando los objetos.
No lo que quieres no existe. Si quieres algo así, debes escribirlo tú mismo.
Parece que desea contar la memoria utilizada por sus objetos.
Si necesita hacer eso, puede verificar cómo lo hace FastMM, y puede enganchar su procedimiento cuando se crean objetos de su tipo.
Mucho trabajo con un objetivo poco claro; Es mejor que tengas una buena razón antes de comenzar.
para saber cuánta memoria utiliza, podría dejar que los objetos no se liberen y dejar que FastMM le diga el tamaño de la fuga.