Autor Beitrag
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Mi 19.07.06 09:52 
Moin moin mal wieder eine OOP Frage und zwar:

Wie geht das bei dem Speichermanagement in Delphi und anderen OOP-Sprachen genau ab? Ich weiß das es eine VMT(Virtual method Lookup Table gibt) das die Zuordnung von Klassen,Methoden irgendwie bewerkstelligt. Aber mir fehlt da ein wenig das Verständnis für das große Ganze zur Laufzeit:
Ein Objekt ist ein Instanz einer Klasse->Speicherplatz für die Werte der Objekt-Variablen. Und die Methoden?
Wird sich da über die RTTI(Runtime Type Identification) rückwärts der Vererbungshierachie abgegrast bis die Methode gefunden wurde? Und wenn das so ist, wäre es ja am klügsten die Methoden doch an die Objekte zu hängen, die sehr häufig instanziert werden(Ich dachte immer, dass da pro Objekt extra immer noch ein Funktionspointer reserviert wird was 4Bytes kostet und bei 1000 Objekten sich doch läppert) da ansonsten unnötig lange in den Elternklassen gesucht werden muss (und die Identifizierung IMHO per Strings(Classname) erfolgt, was ja ziemlich langsam ist).

Wie ist denn das nun :gruebel:
Bernhard Geyer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: Mi 19.07.06 20:41 
Eine kurze Erklärung gibt es bei Wiki (de.wikipedia.org/wik..._virtueller_Methoden)
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 19.07.06 23:22 
Ich glaub, du verwechselst grad DMI und VMT ;-) Du musst bei Delphi zwischen zwei verschiedenen Verfahren unterscheiden: virtual und dynamic:

Die VMT ist, wie Du richtig erkannt hast EINE Tabelle, die jegliche Methoden-Zeiger einer Klasse enthält. Wenn Du nun eine virtuelle Methode aufrufen möchtest, so dereferenziert Delphi zuerst den Zeiger auf die VMT und greift dann auf einen fixen Offset in der VMT zu, der für jede virtuelle Methode eindeutig ist. Dabei muss in derVMT jede Methode von jeder Elternklasse enthalten sein, da man sonst immer nur die Methoden der Laufzeit-Klasse, aber keiner ihrer Eltern aufrufen könnte.

Anders sieht das ganze für dynamic-Methoden aus. Diese werden über eine Art "Methoden-ID" aufgerufen. Wenn nun ein Aufruf erfolgt, so wird diese Methoden-ID in das (E)SI-Register gespeichert und die Methode System.@CallDynaInst (und damit indirekt System.GetDynaMethod) aufgerufen.
Diese sucht nun im gesamten Vererbungsbaum von den Tochterklassen ausgehend nach der besagten Methode gesucht.

Damit sind virtuelle Methoden sehr schnell im Aufruf, brauchen aber mehr RAM. Außerdem sind sie ineffizient, wenn die Methoden nur selten überschrieben werden. Bei dynamischen Methoden spart man zwar zur Laufzeit bzgl. der Tabellen Speicher, brauch aber länger, um diese aufzurufen. Wer schnelle Programme haben will, sollte daher immer virtuelle Methoden nutzen ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Do 20.07.06 01:45 
Wozu solche Fragen wegen 4 kB im Zeitalter von GB-Hauptspeicher und DVD - Brennern ? Die VMT ist eine verkettete Liste, die durchsucht wird, um den nächstgelegenen Vorgänger zu finden. Es geht um binäre Bäume. Deshalb wohl die plausiblen 4 Byte pro Eintrag. Eine praktische Bedeutung haben die aber kaum, selbst bei einem DAU-Programmierer.

Problematisch kann es nämlich höchstens dann werden, wenn zur Laufzeit was erzeugt wird und zwar in Unmassen und sehr lange (1 Woche ?), ohne den Speicher wieder freizugeben. Da wird viel automatish gemacht, sofern das Programm beendet wird. IMHO geht es um theoretische Fragen. Habe z.B. mal ausgerechnet, wie lange es dauert, bis der MaxInt - Wert in einer DB-Tabelle erreicht wird, sofern die ID pro Sek, einmal hochgezählt wird. Rechne mal nach was das ist : > 2.000.000.000 Sek. Wer jahrelang ununterbrochen so schnell tippen kann, der soll sich mal melden. :mrgreen:

_________________
Gruß
Hansa
digi_c Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Do 20.07.06 07:47 
Also ich habe Dateien und Ordner per Klassen modelliert. Da diese Objekte doch sehr häufig instanziert werden müssen diese ja performant sein. Deswegen habe ich probiert, unnötigen Kram von diesen Klassen fern zu halten und in eine Zwischenklasse gepackt. Dadurch ist das an einigen Stellen natürlich nicht so schön OOP wie ich es gerne hätte. Nur wollte ich wegen ein bischen Bequemlichkeit nicht gleich den Speicher unnötig belasten.

Also sollte man getrost immer alles was man braucht an eine Klasse kitten? Auch wenn diese sehr oft erzeugt wird?
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 20.07.06 08:48 
Jup, da die VMT und DMT-Pointer eh immer auf die Klassen-RTTI zeigen und nicht pro Instanz gehalten werden. Den Overhead zwecks dieser beiden Pointer hast Du eh, also kannst Du ihn getrost ignorieren (sind übrigens MINDESTENS immer 20 Byte, da einige Standard-Methoden auch direkt im Datenbereich kopiert werden (um genau zu sein alle statischen).

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
digi_c Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Do 20.07.06 11:59 
Alles klar!

Woher habt ihr eigentlich das ganze Detialwissen, wie Delphi im Hintergrund arbeitet, habt ihr da mal Links?
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 20.07.06 14:28 
Aus den Delphi-Sources ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
digi_c Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Do 20.07.06 14:56 
Mkey... :?