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