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
Motzi 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. ;)
opfer.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
hanspeter 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!