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 gleiche   type_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.

War es hilfreich?

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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top