Wann können verschiedene type_info Instanzen für denselben Typ typeid zurückgeben?
-
10-07-2019 - |
Frage
Andrei Alexandrescu schreibt in Modern C ++ Entwurf :
Die Objekte von
typeid
zurückgegeben haben statische Speicher, so müssen Sie nicht auf Sorgen über Lebensdauer Fragen.
Andrei fährt fort:
Der Standard garantiert nicht, dass jeder Aufruf von, sagen wir,
typeid(int)
gibt einen Verweis auf die gleichetype_info
Objekt.
Auch wenn der Standard dies nicht garantieren, wie dies gemeinsam Compiler wie GCC und Visual Studio umgesetzt wird?
typeid
Unter der Annahme, leckt nicht (und zurück eine neue Instanz jeden Anruf), ist es eine „Tabelle“ pro Anwendung pro Übersetzungseinheit, pro dll / so, oder etwas ganz anderes?
Gibt es Zeiten, in denen &typeid(T) != &typeid(T)
?
Ich interessiere mich hauptsächlich für Compiler für Windows, aber alle Informationen für Linux und andere Plattformen wird auch geschätzt.
Lösung
Gibt es Zeiten, in denen & typeid (T)! = & Typeid (T)?
Ich interessiere mich hauptsächlich für Compiler für Windows, aber alle Informationen für Linux und andere Plattformen wird auch geschätzt.
Ja. Unter Windows DLL kann nicht nicht aufgelöste Symbole haben, so. Wenn Sie:
foo.h
struct foo { virtual ~foo() {} };
dll.cpp
#include "foo.h"
...
foo f;
cout << &typeid(&f) << endl
main.cpp
#include "foo.h"
...
foo f;
cout << &typeid(&f) << endl
Möchten Sie verschiedene Hinweise geben. Denn bevor dll wurde typeid (foo) geladen sollte vorhanden sein sowohl in der DLL und primären exe
Mehr dann, dass unter Linux, wenn ausführbares Haupt nicht mit der Option -rdynamic kompiliert wurde (oder --export-dynamisch) dann würde typeid auf unterschiedliche Symbole in ausführbaren aufgelöst werden und in gemeinsam genutztes Objekt (die in der Regel nicht unter ELF-Plattformen geschieht) wegen einiger Optimierungen durchgeführt, wenn die Verknüpfung ausführbar -. Entfernen von unnötigen Symbole
Andere Tipps
Standards lassen manchmal ein bestimmtes Verhalten nicht spezifiziert, um Implementierungen eine gewisse Freiheit zu geben. In diesem Fall, wie TypeIDs verwaltet wird an den Compiler Implementierung überlassen wird und Sie sind einfach eine Reihe von Regeln gegeben werden (im Wesentlichen: betrifft nicht selbst mit, wie der Speicher für diese zugeordnet wird)
.Gibt es einen besonderen Grund, warum Sie müssen in der Lage sein TypeIds auf ihre Speicheradresse vergleichen basiert? TypeIds bereits außer Kraft setzen == und! =, Um Sie die Möglichkeit, sie zu vergleichen, um zu liefern, und einen Namen (), die verwendet werden könnte, sie eindeutig identifizieren zu können.
Wenn Sie die C ++ Programming Language (Bjarne Stroustrup) zur Verfügung haben, Kapitel 15 hat eine Menge Details über Klassenhierarchien Handhabung. Vielleicht finden Sie vielleicht eine andere Lösung gibt?