Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Speicherbedarf einer Klasse


hanspeter - Di 19.04.05 20:25
Titel: Speicherbedarf einer Klasse
Hallo,
hat wer eine Idee, wie ich den tatsächlichen Speicherbedarf einer Klasse (also das was auf dem Heap allociert wird) herausbekomme.
SizeOf(Class) gibt mir ja nur die Zeigergröße (4 byte) zurück.
Ich verwende zur Datenhaltung in einem Projwkt eine relativ umfangreiche Klasse.
Jetzt habe ich eine Rückmeldung, dass bei einer bestimmten Anzahl von Daternsätzen auf manchen Rechnern Instabilitäten auftreten.
Mein Verdacht wenig Speicher -> Auslagerungsdatei)

Mit Gruß Peter


hanspeter - Di 19.04.05 20:42

Manchmal hat man Tomaten auf den Augen.
Gerade geschrieben dann gefunden.
InstanceSize heist des Rätsels Lösung.

Gruß Peter


Motzi - Di 19.04.05 20:42

TObject bietet eine Klassenfunktion namens "InstanceSize" - das sollte helfen...

Gruß, Motzi


opfer.der.genauigkeit - Di 19.04.05 20:43

Einer Klasse oder die größe der Instanz?

Instanzgrößen kann man anhand ihrer Instanzvariablen berechnen.

z.B.

Delphi-Quelltext
1:
2:
3:
4:
  private
    a: integer;
    b: char;
..


+ den Zeiger der Instanz.. 4 Byte

dann kannst du dir das zusammenzählen. :)

Wie groß eine Klasse werden kann.. hm.. mal überlegen ;)

Genau weiß ich das nicht aber gehen wir mal so an die Sache ran:

Du könntest versuchen im Codesegment die größen der einzelnen Funktionen
für die Klasse herauszufiltern. Allerdings hab ich sowas noch nie gemacht. :mrgreen:

Alternativ wäre vielleicht noch n Weg über TObject möglich, indem du
über die oben erwähnte Instanz eben versuchst an solche Informationen wie
InterfaceTable, VMT und sonstige Methoden zu kommen.

Aber ich leg meine Hand dafür nicht in's Feuer, daß das erfolg haben könnte. :lol:


opfer.der.genauigkeit - Di 19.04.05 20:46

user profile iconMotzi hat folgendes geschrieben:
TObject bietet eine Klassenfunktion namens "InstanceSize" - das sollte helfen...

Gruß, Motzi


Also reden wir doch von Instanzen nicht von Klassen??? :idea:


UC-Chewie - Di 19.04.05 21:02

Eine Klasse braucht nicht viel Speicher. Im Prinzip nur das, was die VMT und ein paar andere Bereiche benötigen. Sind insgesamt zwar schon 2-300 Byte, aber nur einmal pro Klasse.


delfiphan - Di 19.04.05 21:05

@opfer: Der erste Satz im ersten Post beantwortet deine Frage. ;)
user profile iconopfer.der.genauigkeit hat folgendes geschrieben:
Instanzgrößen kann man anhand ihrer Instanzvariablen berechnen.

z.B.

Delphi-Quelltext
1:
2:
3:
4:
  private
    a: integer;
    b: char;
..


+ den Zeiger der Instanz.. 4 Byte

dann kannst du dir das zusammenzählen. :)

Das zusammen zu zählen reicht noch nicht, da eine Klasse nicht packed ist.

Es ist vielleicht noch erwähnenswert, dass eine Instanz einer völlig leeren Klasse (TObject) schon 4 Bytes für sich beansprucht (der Zeiger auf die VMT). Plus normalerweise noch die 4 Bytes für die Referenz (Pointer) auf das Objekt. Also muss man im Normalfall mit 8 Bytes + Daten rechnen.


wdbee - Mi 20.04.05 13:13

user profile iconhanspeter hat folgendes geschrieben:
Manchmal hat man Tomaten auf den Augen.
Gerade geschrieben dann gefunden.
InstanceSize heist des Rätsels Lösung.


Das stimmt so nicht immer! Zwar liefert diese Funktion den Wert, der bei der Initialisierung zunächst für alle "inneren" Variablen benötigt und initialisiert wird, aber wenn die Klasse Variablen enthält, die selbst Speicher allocieren, dann kommt deren Speicherbedarf noch dazu! Typische Vertreter: Dynamische Arrays und Strings.