2016-04-17 20 views
13

Für die Compilerimplementierungen, die vtables verwenden: Gibt es Fälle, in denen virtuelle Funktionstabellen zur Laufzeit geändert werden? Oder werden Vtables nur zur Kompilierzeit gefüllt, und es werden keine Aktionen ausgeführt, um sie zur Laufzeit zu ändern?Vtable-Änderungen zur Laufzeit

+2

Welche Laufzeitmodifikationen sehen Sie als nützlich/möglich an? –

+2

@ Cheersandhth.-Alf, wenn es ein einfaches C++ Programm ist, dann ist es albern. aber wenn er (jetzt oder in der Zukunft) etwas wie VM oder einen Interperter/JIT-Compiler schreiben muss, würde ich seine Frage nicht so schnell verwerfen. –

+0

Es ist imp ... sehr schwierig, mit solch einem Design aufwarten zu können thread-sicher, so ist es nicht getan. –

Antwort

8

Ich kenne keine C++ ABI mit einer Polymorphismus-Implementierung, die virtuelle Tabellen verwendet, die sich zur Laufzeit ändern.

Es wäre sowieso nicht sehr nützlich, da virtuelle Tabellen in der Regel eine Eigenschaft des Codes beschreiben (die Beziehung der Memberfunktionen zueinander in der Klassenhierarchie) und C++ - Code zur Laufzeit nicht ändert.

Und weil es nicht sinnvoll wäre, wäre es verschwenderisch.

+0

Geht die VTables auf Codeabschnitt oder Datenabschnitt in dem ausführbaren Bild? –

+2

@KarolisM ilieška: Unter welcher Umsetzung? Und warum musst du es wissen? –

+0

Um genau zu sein: ARM Keil, aber das gilt auch für gcc Arm. 1. Ich bin gerade curious, 2. Ich arbeite mit eingebetteten Systemen und manchmal ist es notwendig zu wissen, wo man einige Abschnitte platziert. –

2

Die kurze Antwort ist nein.

Eine etwas längere (und wahrscheinlich implementierungsspezifische) Antwort ist, dass sich der Zeiger des Objekts auf die tatsächliche vtable während der Ausführung eines Konstruktors und Destruktors einer abgeleiteten polymorphen Klasse ändert, sodass überschriebene Methoden in einer abgeleiteten Klasse nicht ausgeführt werden durch den Konstruktor/Destruktor der Basisklasse, während die abgeleitete Klasse noch nicht konstruiert wurde/wurde zerstört.

Wenn Sie Objekte wollen, dann Klasse während der Laufzeit ändern, haben Sie eine Reihe von Optionen:

  1. Objective-C (++)

  2. Hand-Code, um Ihren eigenen Versand Mechanismus

  3. python/javascript usw. al.

  4. (die beste Option) überdenken Sie Ihr Design.

+1

Es ändert sich nicht die vtable. Es ist das vptr-Mitglied des Objekts unter Zerstörung! –

+0

auch, 'std :: function' kann zur Laufzeit neu zugewiesen werden, so ist dies eine andere Option –

+0

@KerrekSB behoben, obwohl ich bin mir sicher, es gibt bessere Formulierung –