Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wie ermittelt man die Größe eines Objekts im Speicher? (https://www.delphipraxis.net/106851-wie-ermittelt-man-die-groesse-eines-objekts-im-speicher.html)

TonyMontana 17. Jan 2008 18:22


Wie ermittelt man die Größe eines Objekts im Speicher?
 
Diese Frage konnte mir in meinem letzten Thema keiner beantworten.

Es geht um ein Objekt, dass folgendermaßen aussieht:

Delphi-Quellcode:
type
  TMyRec = class(TObject)
  private
    FValue: Integer;
    FText: String;
    FStringList: TStringList;
    function GetList(i: Integer): string;
    procedure SetList(i: Integer; const Value: string);
  public
    property Value: Integer read FValue write FValue;
    property Text: string read FText write FText;
    property SringList[i: Integer]: string read GetList write SetList;
    constructor Create;
    destructor Destroy;
end;
Im Prinzip geht es mir darum, das Objekt in eine Datei zu speichern. Theoretisch ginge das ja auch wenn man einzeln die Felder einliest mit SizeOf und Length sollte man dann auch die Größe der Felder ermitteln können...
Allerdings wird das doch etwas umständlich, sollte die Klasse mal erweitert werden ...
Es muss doch irgendwie Möglich sein, zB einen Pointer auf den Anfang einer Klasseninstanz wie oben definiert zu setzen und dann Komplett in eine Datei "einzulesen", oder?
Dafür benötige ich aber eben auch die Größe der Klasseninstanz, ansonsten weiß ich ja nicht wie viel eingelesen werden soll.

Ich hoffe mal, ich konnte mein Problem deutlich machen. Vielleicht gibt es ja auch bessere Alternativen für diese Problemstellung?

Falls mir wieder keiner Antwortet, dann nehme ich einfach mal an, die Frage ist so trivial, dass ich erstmal ein Delphi-Buch lesen sollte um dann in der Lage zu sein mir die Frage selbst zu beantworten? :mrgreen:

Apollonius 17. Jan 2008 18:24

Re: Wie ermittelt man die Größe eines Objekts im Speicher?
 
Delphi-Referenz durchsuchenInstanceSize

TonyMontana 17. Jan 2008 18:37

Re: Wie ermittelt man die Größe eines Objekts im Speicher?
 
InstanceSize hatte ich auch schon probiert ... liefert mir irgendwie 16. Und das kann nicht sein, da ich vorher stehen hatte:
StringList.Text := ListBox1.Items.Text oder so... Wobei in der ListBox einiges stand!
Oder setze ich da wieder nur einen Pointer?
Auch wenn, dass hilft mir bei meinem Problem ja dann auch nicht weiter...
Also mehr und bessere Vorschläge :zwinker:

DeddyH 17. Jan 2008 18:38

Re: Wie ermittelt man die Größe eines Objekts im Speicher?
 
Naja, FStringList enthält nur einen Pointer auf die Instanz.

Apollonius 17. Jan 2008 18:39

Re: Wie ermittelt man die Größe eines Objekts im Speicher?
 
Ansistrings und Klassen sind Pointer. InstanceSize ist für alle Instanzen einer Klasse gleich (deshalb ist es auch eine Klassenmethode).

sirius 17. Jan 2008 18:43

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

Es muss doch irgendwie Möglich sein, zB einen Pointer auf den Anfang einer Klasseninstanz wie oben definiert zu setzen und dann Komplett in eine Datei "einzulesen", oder?
Nö. Geht nicht.
Du kannst dich ja mal hier und hier schlau machen.

TonyMontana 17. Jan 2008 18:46

Re: Wie ermittelt man die Größe eines Objekts im Speicher?
 
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:

@Sirius: Ok geht also nicht... Endlich mal ne klare Antwort und nicht irgendwelche Empfehlungen, wo ich dann irgendwann herausfinden muss, das hat mit meinem Problem bzw. meiner Fragestellung nichts zu tun.
Ich muss jetzt erst mal weg, mache mir mal Gedanken dann. Warscheinlich kann ich dann nur den Umweg mit length etc nehmen, mit der funktion bekomme ich da die Stringlänge heraus und kann mir alle Daten selber zusammensuchen und dann abspeichern.

Apollonius 17. Jan 2008 18:48

Re: Wie ermittelt man die Größe eines Objekts im Speicher?
 
Das geht nicht. Wenn du zum Beispiel Zeiger in der Klasse hast, dann weißt nur du (und der Memorymanager), wie groß der Speicherblock ist, auf den sie zeigen. Strings und dynamische Arrays lassen sich noch über RTTI erkennen.

himitsu 17. Jan 2008 18:51

Re: Wie ermittelt man die Größe eines Objekts im Speicher?
 
InstanceSize liefert die größe des Ojektes

und was da noch anderswo über Pointer unt Co. gelagert wird, ist da nicht enthalten.


für ein korrektes Ergebnis mußt du selber alles auslesen, aber das geht nur für eine eigene klasse, die du bearbeiten kannst.

DeddyH 17. Jan 2008 18:53

Re: Wie ermittelt man die Größe eines Objekts im Speicher?
 
Und zum Speichern: das wird spätestens dann ganz übel, wenn mehrere Instanzen in einer Datei abgelegt werden sollen. IMO müsste man sich dafür dann ein generisches Format ausdenken, aber ich lasse mich auch gerne eines Besseren belehren.

Reinhard Kern 18. Jan 2008 00:43

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

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

TonyMontana 18. Jan 2008 12:52

Re: Wie ermittelt man die Größe eines Objekts im Speicher?
 
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 :P

Schwedenbitter 6. Sep 2008 12:36

Re: Wie ermittelt man die Größe eines Objekts im Speicher?
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz