AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Wie ermittelt man die Größe eines Objekts im Speicher?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie ermittelt man die Größe eines Objekts im Speicher?

Ein Thema von TonyMontana · begonnen am 17. Jan 2008 · letzter Beitrag vom 6. Sep 2008
Antwort Antwort
Seite 2 von 2     12   
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#1

Re: Wie ermittelt man die Größe eines Objekts im Speicher?

  Alt 18. Jan 2008, 00:43
Zitat von TonyMontana:
Ist ja alles schön und gut und warscheinlich auch richtig, dennoch möchte ich ja nicht die Größe der Klasse sondern des Objekts. Und zwar aus dem Grund, weil ich das ganze Objekt dann mal speichern und irgendwann wiederladen möchte!
Geht das jetzt irgednwie oder verstehe ich irgendwas nicht? :wiejetzt:
Problem1: es gibt garkein kompaktes Objekt im Speicher, alles was verpointert ist, steht woanders, wo eben das Speichermanagment eine Platz gefunden hat.

Problem2: eine Instanz belegt zwar eine bestimmte Menge Speicher, aber das ist nicht alles, der Speicher für die Klasse kommt ja noch dazu. Bei 3 Objekten wird also 1 x Klasse und 3 x Instanz belegt. Wahrscheinlich willst du ja nur den Inhalt von Feldern abspeichern und nicht die Methoden, aber auch da gibt es Variablen der Klasse und der Instanz.

Problem3: ein Pointer kann ja wiederum auf ein Objekt zeigen, also stellt sich das Problem rekursiv von neuem. Für eigene Klassen könntest du ja immer eine Funktion schreiben, die rekursiv den Speicherbedarf einschliesslich der "Unterobjekte" bestimmt, aber es sind ja auch Objekte enthalten die nicht von dir sind. Brauchbar wäre eine solche Funktion nur, wenn alle Objekte sie hätten, m.a.W. wenn sie für TObject und alle abgeleiteten Klassen definiert wäre. Prinzipiell wäre das möglich, ist aber eben nicht so.

Problem4: wenn Problem3 gelöst wäre, hätte man die Menge Speicher, die ein einzelnes Objekt belegt, korrekt bestimmt, aber schon bei 2 Objekten muss das nicht mehr stimmen - es können ja mehrere Pointer auf das selbe Objekt zeigen. Ich glaube nicht, dass dieses Problem ohne eine komplette Speicherbelegungs-Analyse lösbar wäre.

Problem5: InstanceSize schliesst nur den Bedarf für die Pointer ein, also sozusagen den Speicherbedarf vor den nachgeordneten Creates, damit kann man nichts anfangen ausser dem einen Zweck, für den es vorgesehen ist.

Gruss Reinhard
  Mit Zitat antworten Zitat
TonyMontana
(Gast)

n/a Beiträge
 
#2

Re: Wie ermittelt man die Größe eines Objekts im Speicher?

  Alt 18. Jan 2008, 12:52
Ok, alles klar! Dann werde ich das wohl doch anders lösen, indem ich einfach ShortStrings, Integer-Variablen etc benutze und diese dann bei bedarf auselese und hintereinander kopiere. Da ich ja dann genau weiß, wie die Maximallänge der einzelnen Inhalte sein wird, sollte das einlesen später auch keine Probleme bereiten. Dann muss ich eben mit den String-Funktionen wie Copy, Delete, Trim etc arbeiten...
Hmm, oder was mir noch einfällt, ich könnte auch die einzelnen Felder, die Zeichen beinhalten als String-Variablen deklarieren, mit Length kann ich die Länge des Inhalts herausfinden und dann baue ich mir einfach Trennzeichen ein, die mir dabei helfen, den Inhalt aus so einem zusammengesetzen String später wieder korrekt auszulesen.
Alternativ dazu wäre warscheinlich wieder ein eigenes Dateiformat nützlich, wo dann am Anfang drinnsteht, wo was steht und dann eben nur dieser Datei-Header festgelegt ist, der alle Informationen beinhaltet...

Ich werde mal testen, denke das sollte ich gerade noch hinbekommen
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Wie ermittelt man die Größe eines Objekts im Speicher?

  Alt 6. Sep 2008, 12:36
Ich haue gleich mal in die Kerbe:

Ich habe eine TObjectList, die derzeit ausschließlich mit einer Menge TBitmaps belegt ist. Die sind immer gleich groß. Momentan weise ich die Inhalte der Bitmaps vor dem Speichern in eine Datei jeweils einzeln einer anderen Komponente zu über RotateImage1.Assign(Bitmap);. Mit der Komponente drehe und stauche ich und speichere danach.
Ich überlege nun zur Vereinfachung meine TObjectList gleich mit den TRotateImage zu belegen. Da sich die Bitmaps größenmäßig nicht ändern, interessiert mich deren Speicherverbrauch nicht.

Gibt es wirklich keine Möglichkeit herauszufinden, wie groß der "Overhead" von TBitmap im Vergleich zu TRotateImage ist?

Ich habe in der Liste ca. 100 Grafiken (Nur am Rande: 1 bit, 200 dpi, DINA4). Das frisst viel Speicher, geht aber noch. Ich wüsste deshalb gern, wieviel mehr die eine im Vergleich zur anderen Komponente braucht, um mich bzgl. des weiteren Vorgehens entscheiden zu können...

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz