Was ist die einfachste RTTI-Implementierung für C ++?

8

Ich versuche, die Ausnahmebehandlung für ein eingebettetes Betriebssystem zu implementieren, und ich bin daran fest, wie man den Typ der geworfenen "Ausnahme" erkennt (um den passenden Handler auszuwählen).

Das Speichern und Wiederherstellen von Kontextteilen der Ausnahmebehandlung ist bereits erfolgt, aber ich kann keine bestimmten Handles haben, da ich den Typ der geworfenen "Ausnahme" nicht erkennen kann. Die Standard-RTTI-Implementierung von C ++ ist zu stark von anderen Bibliotheken abhängig und aus diesem Grund halte ich es derzeit für nicht verfügbar.

Wenn ich bedenke, dass mein Ziel ein eingebettetes System ist und ich deshalb nicht viel Code erstellen kann, was ist die kleinste Implementierung von "Runtime Type Information", die ich bekommen kann (oder machen kann)?

- Bearbeiten -

Ich arbeite nicht am Compiler, es ist ein ia32-g ++.

    
freitass 03.07.2009, 21:48
quelle

2 Antworten

11

Da Sie in einer eingebetteten Umgebung arbeiten, bevorzugen Sie vermutlich extrem minimale Lösungen und Sie können nicht-standardmäßige oder nicht-portable Fakten über Ihren Compiler nutzen.

Wenn eine Klasse in C ++ polymorph ist (hat mindestens eine eigene virtuelle Funktion), hat sie wahrscheinlich einen Zeiger auf eine vtable, die irgendwo darin eingebettet ist. Es kann sein, dass der Vtable-Zeiger am Anfang des Layouts des Objekts im Speicher erscheint.

Dies gilt für viele Compiler, die C ++ ABI verwenden - eine verwandte SO-Frage hier .

Wenn dies der Fall ist, können Sie möglicherweise so auf die vtable zugreifen:

%Vor%

Dann können Sie die VTables zweier Zeiger mit Objekten vergleichen, um zu sehen, ob sie auf den gleichen Objekttyp zeigen.

Also würde ein "type switch" (was im Prinzip der Haken ist) so etwas tun:

%Vor%

Sie könnten dieses Muster in einem CATCH-Makro verstecken.

Wichtiger Punkt - Wenn Sie eine Klasse von einer Basis ableiten, aber die abgeleitete Klasse keine virtuellen Funktionen überschreibt oder keine neuen virtuellen Funktionen hinzufügt, könnte der Compiler möglicherweise die vtable der Basisklasse für verwenden die abgeleitete Klasse. Dies bedeutet, dass sie, um zwischen zwei Ausnahmetypen zu unterscheiden, jeweils eine virtuelle Funktion überschreiben müssen, um sicherzustellen, dass sie ihre eigenen Vtables haben.

Beachten Sie, dass dies nur ein kleiner Bruchteil davon ist, was die Ausnahmebehandlung betrifft. Es gibt auch die kleine Sache, den Stapel abzuwickeln! Sie müssen die Destruktoren aller Objekte im Stapel aufrufen, wenn Sie zum Handler springen. Es ist nicht nur eine Frage von setjmp / longjmp.

    
Daniel Earwicker 03.07.2009, 22:06
quelle
2

Die einfachste RTTI, die ich mir vorstellen kann, besteht darin, alle Klassen von einer gemeinsamen Basis abzuleiten, die eine rein virtuelle "GetType ()" - Funktion haben. Entweder wird eine Zeichenfolge zurückgegeben oder eine riesige Enumeration mit allen darin enthaltenen Typen erstellt. Es ist ziemlich einfach, schnell und hat wenig Speicheraufwand. Nicht besonders flexibel.

    
Goz 03.07.2009 21:54
quelle

Tags und Links