2013-03-14 14 views
19

Wie verbessern dynamische Methoden die Code-Größe?
Welche Code-Größe bedeutet ??? Es bedeutet die Dateigröße des Programms.exe?Was ist der Unterschied zwischen dynamischen und virtuellen Methoden?

das Handbuch nach:

Im Allgemeinen sind virtuelle Methoden der effizienteste Weg polymorphes Verhalten zu implementieren. Dynamische Methoden sind nützlich, wenn eine Basisklasse viele überschreibbare Methoden deklariert, die von vielen absteigenden Klassen in einer Anwendung geerbt werden, aber nur gelegentlich außer Kraft gesetzt werden.

Was ich gewinnen, wenn ich anstelle von virtuellen dynamischen verwenden, wenn nur eine der geerbten Klassen die Methode überschreiben, da auch das Handbuch sagt:

virtuelle Methoden Geschwindigkeit optimieren, während dynamische Verfahren optimiert für Codegröße

+0

Die beiden Zitate sagen, was Sie wissen müssen. Unterm Strich ist meiner Meinung nach immer virtuell. –

+0

@DavidHeffernan Beitrag bearbeitet! – EProgrammerNotFound

Antwort

38

Virtuelle Methoden werden mit einer virtuellen Methodentabelle (VMT) implementiert. Es gibt eine VMT für jede Klasse. Die VMT enthält einen Eintrag für jede virtuelle Methode in der Klasse. Und dieser Eintrag ist die Adresse der Methode.

Dies ermöglicht sehr effizientes Anrufen. Sie erhalten einfach die Adresse des VMT, der sich in einem festen Offset von Self befindet. Dann suchen Sie den Methodenzeiger nach Index auf und rufen die Methode auf.

Dies bedeutet, dass wenn Sie eine Klasse mit vielen virtuellen Methoden haben und Sie eine Unterklasse ableiten, erstellen Sie eine brandneue VMT mit allen virtuellen Methoden. Und wenn Sie viele von ihnen nicht überschrieben haben, dann werden Sie feststellen, dass die VMTs viele Überschneidungen haben.

Dies war in den Tagen von 16 Bit wichtig. Die VMTs könnten sehr viel Platz im ausführbaren Image einnehmen (das ist mit der Code-Größe gemeint) und Sie könnten keinen Platz mehr für die VMTs haben. So wurden dynamische Methoden eingeführt. Das Analog zur VMT ist die dynamische Methodentabelle DMT. Dies wird anders implementiert, um Wiederholungen zu vermeiden, wenn Methoden nicht überschrieben werden. Der Nachteil ist, dass der Aufruf dynamischer Methoden teurer ist.

In modernen Zeiten, seit 32 Bit, und vor allem mit den sehr fett ausführbaren Dateien, die Delphi produziert, sind diese Größenprobleme egal. Daher empfehlen wir, ausschließlich virtuelle Methoden zu verwenden.

Virtuelle Methoden Tabelle Implementierungen sind gut verstanden und es gibt viele Referenzen können gefunden werden, um sie zu verstehen. Das ist weniger für dynamische Methoden, die eher kurios sind. Die besten Quellen für Informationen, die ich gefunden haben, sind von Hallvard Vassbotn Blog:

+0

+1 Dynamischer Gewinn ist in der Tat eitel, wenn Sie mit der riesigen ausführbaren Größe vergleichen, die von den neuesten Delphi-Versionen erzeugt wird. –

+2

+1 Sehr schöne Erklärung !! ich danke dir sehr!!Ich lese das gesamte Papier – EProgrammerNotFound

+4

Die DMT-Implementierung in Delphi (die hauptsächlich zum Versenden von Fenstermeldungen verwendet wird) könnte viel schneller sein, wenn das DMT (vom Compiler) sortiert würde, so dass eine binäre Suche anstelle eines linearen verwendet werden könnte suche nach den Methodenzeigern. –

Verwandte Themen