Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Saber cuanto ocupa un objeto en memoria (https://www.clubdelphi.com/foros/showthread.php?t=63036)

AFilth 27-01-2009 09:40:51

Saber cuanto ocupa un objeto en memoria
 
Buenos días,

hay alguna forma de saber lo que ocupa un objeto creado en memoria?

Me explico.

Si tengo este código:
Código Delphi [-]
  TClase2 = class
    public
      Aux: String;
      constructor Create(A: String);
  end;

  TClase1 = class
    N: String;
    Numero: integer;
    Lista: TObjectList;
    constructor Create();
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  a: TClase1;
  b, c, d: TClase2;
begin
  a := TClase1.Create;
  b := TClase2.Create('cosa1');
  c := TClase2.Create('cosa2');
  d := TClase2.Create('cosa3');
  a.N := 'Clase1';
  a.Numero := 1;
  a.Lista.Add(b);
  a.Lista.Add(c);
  a.
  ShowMessage(intToStr(a.InstanceSize));
end;

{ TClase2 }

constructor TClase2.Create(A: String);
begin
  Aux := A;
end;

{ TClase1 }

constructor TClase1.Create;
begin
  Lista := TObjectList.Create;
end;

Da igual cuantos objetos añada a la Lista del objeto a que siempre me va a devolver 16 bytes. Que es la suma de 4 bytes del puntero a la clase, + 4 del String, +4 del entero + 4 del puntero a la objectlist. Pero esa objectlist e incluso el string pueden variar en tamaño. Como puedo saber realmente lo q ocupa en un momento dado????

coso 27-01-2009 11:45:14

hola, echale un vistazo a la funcion sizeof (aunque ahora mirando la ayuda no estoy seguro si te dara el tamaño del objeto o del puntero...:confused:). Saludos.

poyo 27-01-2009 12:22:08

Está complicado...
 
no creo que eso sea tarea sencilla. Es muy necesario? hay alguna que otra estructura interna en los objetos como ser la VMT.
Necesitas saber la instancia o los datos de la instancia?
De ser esto último, las propiedades "published" y "Stored" es suficiente? si es así, bastará con recorrer el objeto Rtti mediante... también debes recorrer a todo lo persistente que cuelgue de él.

Al González 27-01-2009 16:17:00

Hola AFilth.

Te hago las mismas preguntas que Poyo, solicitándote que nos plantees cuál es el propósito de conocer el tamaño de toda la rama de datos (o aclares si es otra cosa lo que buscas). ¿Algo que ver con el almacenamiento de los mismos en algún medio? Danos más detalles de tu caso, por favor. :)

Cita:

Empezado por poyo (Mensaje 336059)
hay alguna que otra estructura interna en los objetos como ser la VMT.

Secundando el comentario de Poyo, en la RTTI muchas clases tienen algo llamado "tabla de inicialización" (initialization table), en el desplazamiento negativo vmtInitTable de su VMT (ver unidad System.pas). Su existencia permite que los objetos automáticamente liberen campos ("variables" de datos) de tipos que usan contadores de referencia, cuando las instancias son destruidas. Gracias a esa información es posible conocer más sobre la memoria que ocupan ciertos campos, como los de tipo String, pero no puedes conocer del todo las ramificaciones de punteros como los campos de tipo objeto (a menos que éstos estén representados por propiedades publicadas).

Sin adentrarnos más en el lado "tenebroso" del compilador, te invito a dar algo más de contexto sobre tu caso.

Saludos.

Al González. :)

Chris 27-01-2009 16:40:55

Se me ocurre una idea, serviría escribir todo el contenido del objeto a un TStream y luego obtener el tamaño de este Stream?

Saludos.

Al González 27-01-2009 16:48:41

Cita:

Empezado por D&W (Mensaje 336089)
Se me ocurre una idea, serviría escribir todo el contenido del objeto a un TStream y luego obtener el tamaño de este Stream?

Saludos.

Si es a través de los mecanismos estándares de la VCL, el problema con eso sería que sólo se escribirían las partes publicadas (published) y todo aquello que estuviera explícitamente programado para poder ser escrito a un flujo (stream).

Saludos. :)

JXJ 27-01-2009 21:35:11

Cita:

Empezado por AFilth (Mensaje 336038)
Buenos días,

hay alguna forma de saber lo que ocupa un objeto creado en memoria?
Como puedo saber realmente lo q ocupa en un momento dado????

lo que quiere saber es cuanto ocupa su objeto que creo.
para saber cuanto consume de memoria su programa, al hacer varias operaciones del mismo tipo que nos pone de ejemplo.
y hacer un bien programa que consuma pocos recursos sea eficiente.

¿yo tambien me pregunto como medir la memoria que consume mis programas?

Al González 27-01-2009 22:26:50

Cita:

Empezado por JXJ (Mensaje 336158)
lo que quiere saber es cuanto ocupa su objeto que creo.
para saber cuanto consume de memoria su programa, al hacer varias operaciones del mismo tipo que nos pone de ejemplo.
y hacer un bien programa que consuma pocos recursos sea eficiente.

Es posible, pero AFilth todavía no responde a las dudas que nos surgieron de su comentario inicial. :)

poyo 28-01-2009 02:03:41

Tal como Al comentaba, es un problema porque en el proceso de persistencia (streaming o como se llame) no sólo está limitado a propiedades Públicas sino que, ademas, son convertidas a String:
Un bitmap es convertido a Hexadecimal... esos datos terminan ocupando el doble, los colores veces son traducidos a nombres, los enteros en raras oportunidades ocupan los 4 bytes que ocupan en memoria...
Además, algunas propiedades no se guardan (con el valor por default), también no se tiene en cuenta cosas la alineación con la memoria, estruturas empaquedas o no...
en otras palabras, no tiene nada que ver con lo que ocupa en memoria.

Mi instinto me dice que si se quiere saber REALMENTE cuánto ocupa algo en memoria es muy muy difícil, al menos bajo este marco de trabajo (delphi/cbuilder).
Tal vez, si se conoce muy por dentro TODO el funcionamiento de del sistema (Rtl, Vcl, compilador y un largo etc.), hookeando la función de memory allocation (no me viene en castellano) como lo hace el Fast Memory Manager e ir recopilando y ordenando la información, sea factible... pero se me hace que es una tarea importante.
A lo mejor se puede hacer más sencillamente, peor mucho no se me ocurre cómo.

Y, como si fuera poco, si así y todo logramos implementar alguna solución a semejante incógnita (ya me picó el bichito de la curiosidad nuevamente. jejeje) nos vamos a encontrar con un problema aun mayor, que nos va a dar por el c**o! saben a qué me refiero???

http://www.unex.es/~fan/cuantica/mc%...heisenberg.htm

qué dramaturgo soy! pero es verdad... snif snif... bueno, al menos hasta que se compruebe lo contrario, no? ;)

pero claro... no nos vayamos por las ramas (perdón, confieso.. fui yo! :() ... y, como ya se dijo, esperemos a que AFilth conteste lo antes preguntado.

Al González 28-01-2009 03:23:14

Cita:

Empezado por poyo (Mensaje 336195)
Y, como si fuera poco, si así y todo logramos implementar alguna solución a semejante incógnita (ya me picó el bichito de la curiosidad nuevamente. jejeje) nos vamos a encontrar con un problema aun mayor, que nos va a dar por el c**o! saben a qué me refiero???

http://www.unex.es/~fan/cuantica/mc%...heisenberg.htm

qué dramaturgo soy! pero es verdad... snif snif... bueno, al menos hasta que se compruebe lo contrario, no? ;)

pero claro... no nos vayamos por las ramas (perdón, confieso.. fui yo! :() ... y, como ya se dijo, esperemos a que AFilth conteste lo antes preguntado.

Bueno, ya que hablas de curiosidades y mecánica cuántica, mientras AFilth regresa te invito a revisar este misterio, tristemente sin resolver :( (mensaje #7):
http://www.clubdelphi.com/foros/showthread.php?t=9764

Un abrazo subatómico.

Al. :)

poyo 28-01-2009 18:46:03

Al, si bien esto se está tornando "Off topic", he leido tu mensaje y me puse de inmediato a ello... curiosidad, vio?
Así que decidí habrir otro nuevo hilo para que este no se vaya por las ramas:

http://www.clubdelphi.com/foros/showthread.php?p=336279


La franja horaria es GMT +2. Ahora son las 04:51:08.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi