C++ - Code kann mit deaktivierter Laufzeittypinformation kompiliert werden, wodurch dynamic_cast
deaktiviert wird. Virtuelle (polymorphe) Methoden müssen jedoch basierend auf dem Laufzeittyp des Ziels weiterhin bereitgestellt werden. Bedeutet das nicht, dass die Typinformation sowieso vorhanden ist, und dynamic_cast
sollte immer funktionieren können?Keine RTTI, aber immer noch virtuelle Methoden
Antwort
Das Deaktivieren von RTTI beendet dynamic_cast
und typeid
, hat aber keine Auswirkungen auf virtuelle Funktionen. Virtuelle Funktionen werden über die "vtable" von Klassen gesendet, die virtuelle Funktionen haben; Wenn Sie eine vtable vermeiden möchten, können Sie einfach keine virtuellen Funktionen haben.
Viele C++ Code in der freien Natur ohne dynamic_cast
arbeiten kann und fast alles davon kann ohne typeid
arbeiten, aber relativ wenig C++ Anwendungen würden ohne virtuelle Funktionen (oder mehr auf den Punkt überleben, erwartete Funktionen, die sie virtuell sein wird nicht virtuell).
Eine virtuelle Tabelle (vtable) ist nur ein per-instance-Zeiger auf eine Suchtyp-Tabelle für alle virtuellen Funktionen. Sie zahlen nur für das, was Sie verwenden (Bjarne liebt diese Philosophie und widersetzte sich zunächst RTTI). Bei voller RTTI hingegen enden Ihre Bibliotheken und ausführbaren Dateien mit einer Menge ausgeklügelter Strings und anderer Informationen, die eingebacken sind, um den Namen jedes Typs und vielleicht andere Dinge wie die hierarchischen Beziehungen zwischen Typen zu beschreiben.
Ich habe Produktionssysteme gesehen, bei denen das Deaktivieren von RTTI die Größe ausführbarer Dateien um 50% verringerte. Das meiste davon war aufgrund der massiven String-Namen, die in einigen C++ - Programmen, die Vorlagen stark verwenden, enden.
Ok, so dass 'dynamic_cast' weitere Informationen benötigt. Aber es klingt wie 'typeid' könnte immer noch funktionieren, zumindest für Typen, die sowieso eine vtable haben. Kann der Vtable-Zeiger manuell aus C++ - Code aufgerufen werden? –
'typeid' kann nicht funktionieren, weil einer seiner Hauptzwecke darin besteht, für jeden Typ einen Namen anzugeben, und diese Namen (die tatsächlichen nullterminierten Strings) werden einfach nicht ohne RTTI in Objektdateien ausgegeben. Und nein, auf die Vtable kann in C++ nicht manuell zugegriffen werden. Es kann plattformspezifische Möglichkeiten geben, aber selbst das ist selten IMO. –
Oh, tschuldigung. :) Ich nahm an, ohne zu überprüfen, dass "typeid" irgendeine Art von schrägem Integer/Zeiger zurückgibt. Macht Sinn, dass es nicht funktioniert, wenn es ein String ist (edit: eigentlich 'class type_info'). –
- 1. Keine Implementierung in C++, aber es kann immer noch
- 2. Installierte Fabric aber immer noch 'kein Modul fabric.api'
- 3. Benutzerzuordnung hinzugefügt, aber immer noch "undefinierte Methode"
- 4. TypeScript kompiliert, aber immer noch intellisense Fehler
- 5. Entitätsframework: Migration gelöscht, aber immer noch implementiert
- 6. Aktualisiert Git aber immer noch alte Version
- 7. ViewStateMode Deaktiviert, aber immer noch ViewState-Element
- 8. Nicht korrekt gedruckt, aber immer noch
- 9. Keine Fehler - immer noch nicht schreiben
- 10. Delphi: Welche Methoden sollen in RTTI sein?
- 11. Ist die virtuelle Vererbung immer noch erforderlich, wenn die Basisklassen keine Datenelemente enthalten?
- 12. Delphi - RTTI info über Methoden in Datensätzen
- 13. Java - Virtuelle Methoden
- 14. virtuelle Methoden und Vorlagenklassen
- 15. Virtuelle Methoden Optimierung
- 16. Dekoratoren und virtuelle Methoden
- 17. ListView Creator aufgerufen, aber keine anderen Methoden
- 18. Verhindern Link ziehen, aber immer noch Text Hervorhebung
- 19. Funktioniert RTTI mit dem endgültigen?
- 20. Verschachtelte Wörterbuch Verständnis Parität mit Schleife, aber immer noch Fehler?
- 21. Nicht virtuelle Methoden in Java
- 22. Zuweisung von Zeigern, aber Speicher wird immer noch verwendet
- 23. dslVersion - Wie erhöht man, aber unterstützt immer noch ältere Versionen?
- 24. Sqlite3 unter Gruppenentwicklung aber noch immer Heroku Bereitstellung Fehler
- 25. Homebutton überschrieben, aber immer noch beendet, wenn Optionsmenü geöffnet ist
- 26. cURL ist in php.ini aktiviert, funktioniert aber immer noch nicht
- 27. Verwenden Sie Babel-Jest für Jest, aber immer noch Syntaxfehler
- 28. Reine virtuelle Methoden in Python
- 29. Mit IsolationLevel.Snapshot, aber DB ist immer noch sperren
- 30. Drupal6: Anon hat keine "view field_x" Berechtigung, aber es erscheint immer noch in einer Ansicht
Meine Vermutung wäre, dass die vtable noch vorhanden ist, aber da es keine Typinformationen (nur Funktionszeiger) enthält, funktionieren virtuelle Funktionen immer noch. –
Mögliches Duplikat von http://stackoverflow.com/questions/4486609/when-can-compiling-c-without-rtti-cause-problems ...? –
Damit dynamic_cast funktioniert (in komplexen Fällen mit mehrfacher Vererbung) benötigen Sie etwas mehr als virtuelle Funktionstabellen – marom