Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-01-2009
AFilth AFilth is offline
Miembro
 
Registrado: ago 2005
Posts: 119
Poder: 19
AFilth Va por buen camino
Exclamation 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????
Responder Con Cita
  #2  
Antiguo 27-01-2009
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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...). Saludos.
Responder Con Cita
  #3  
Antiguo 27-01-2009
poyo poyo is offline
Miembro
 
Registrado: ene 2009
Posts: 47
Poder: 0
poyo Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 27-01-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
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 Ver Mensaje
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.
Responder Con Cita
  #5  
Antiguo 27-01-2009
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
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.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #6  
Antiguo 27-01-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por D&W Ver Mensaje
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.
Responder Con Cita
  #7  
Antiguo 27-01-2009
JXJ JXJ is offline
Miembro
 
Registrado: abr 2005
Posts: 2.475
Poder: 22
JXJ Va por buen camino
Cool

Cita:
Empezado por AFilth Ver Mensaje
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?
Responder Con Cita
  #8  
Antiguo 27-01-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por JXJ Ver Mensaje
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.
Responder Con Cita
  #9  
Antiguo 28-01-2009
poyo poyo is offline
Miembro
 
Registrado: ene 2009
Posts: 47
Poder: 0
poyo Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Duda para saber que objeto esta em memoria Paulao Varios 0 23-08-2008 15:16:44
¿Cuanto debe saber un informático? Delphius Debates 22 07-12-2005 14:11:38
ADO- Como puedo saber cuanto registros borre o actualice mgaray Conexión con bases de datos 4 11-05-2005 21:28:47
mi programa ocupa DEMASIADA memoria unreal4u Varios 2 24-04-2005 04:42:05
El saber no ocupa lugar !!!!! LucasArgentino SQL 2 13-11-2003 16:35:03


La franja horaria es GMT +2. Ahora son las 16:50:31.


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
Copyright 1996-2007 Club Delphi