Autor Beitrag
hanspeter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 44

Windows

BeitragVerfasst: Di 19.04.05 20:25 
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 44

Windows

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Di 19.04.05 20:42 
TObject bietet eine Klassenfunktion namens "InstanceSize" - das sollte helfen...

Gruß, Motzi

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Di 19.04.05 20:43 
Einer Klasse oder die größe der Instanz?

Instanzgrößen kann man anhand ihrer Instanzvariablen berechnen.

z.B.
ausblenden 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:

_________________
Stellen Sie sich bitte Zirkusmusik vor.
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: 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:

_________________
Stellen Sie sich bitte Zirkusmusik vor.
UC-Chewie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: 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.

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: 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.