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
Antwort
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.
Geht die VTables auf Codeabschnitt oder Datenabschnitt in dem ausführbaren Bild? –
@KarolisM ilieška: Unter welcher Umsetzung? Und warum musst du es wissen? –
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. –
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:
Objective-C (++)
Hand-Code, um Ihren eigenen Versand Mechanismus
python/javascript usw. al.
(die beste Option) überdenken Sie Ihr Design.
Es ändert sich nicht die vtable. Es ist das vptr-Mitglied des Objekts unter Zerstörung! –
auch, 'std :: function' kann zur Laufzeit neu zugewiesen werden, so ist dies eine andere Option –
@KerrekSB behoben, obwohl ich bin mir sicher, es gibt bessere Formulierung –
- 1. MasterPageFile zur Laufzeit wechseln
- 2. Einstellung "Modal" zur Laufzeit
- 3. create Tframes zur Laufzeit:
- 4. Apportieren Kontextkonfiguration zur Laufzeit
- 5. ändern Etikettenposition zur Laufzeit
- 6. Übersteuerung zur Laufzeit __setattr__
- 7. Speichern xamlx zur Laufzeit
- 8. iPhone Ansichten zur Laufzeit?
- 9. Aufrufmethode zur Laufzeit
- 10. Android: Anfrage zur Laufzeit
- 11. Animation zur Laufzeit hinzufügen
- 12. Ninject zur Laufzeit verbindlich
- 13. Bean zur Laufzeit ersetzen
- 14. Klassenimplementierung zur Laufzeit (Java)
- 15. JPA-Kaskadenoptionen zur Laufzeit
- 16. QRadioButtons zur Laufzeit hinzufügen
- 17. Schriftart ändern zur Laufzeit
- 18. Hibernate-Datenbankkennwort zur Laufzeit
- 19. Änderung TopMost zur Laufzeit
- 20. Setze Klasseneigenschaft zur Laufzeit
- 21. Empty ControlCollection zur Laufzeit
- 22. Java-Compiler zur Laufzeit
- 23. Hibernate-Konfiguration zur Laufzeit
- 24. Anruf zur Delegierung zur Laufzeit weiterleiten
- 25. Zeile zur Laufzeit zur Tabelle hinzufügen
- 26. Java-Annotationen zur Laufzeit hinzufügen
- 27. Laden von Jars zur Laufzeit
- 28. Repeaters ItemTemplate zur Laufzeit umschalten
- 29. Programmatisch registrieren HttpModules zur Laufzeit
- 30. Erstellen Sie usercontrol zur Laufzeit
Welche Laufzeitmodifikationen sehen Sie als nützlich/möglich an? –
@ 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. –
Es ist imp ... sehr schwierig, mit solch einem Design aufwarten zu können thread-sicher, so ist es nicht getan. –