Domanda

Andrei Alexandrescu scrive in Design moderno C ++ :

  

Gli oggetti restituiti da typeid hanno   memoria statica, quindi non è necessario   preoccuparsi dei problemi della vita.

Andrei continua:

  

Lo standard non lo garantisce   ogni invocazione, diciamo, di typeid(int)   restituisce un riferimento allo stesso   type_info oggetto.

Anche se lo standard non lo garantisce, come viene implementato nei compilatori comuni, come GCC e Visual Studio?

Supponendo che &typeid(T) != &typeid(T) non perda (e restituisca una nuova istanza ogni chiamata), è una " tabella " per applicazione, per unità di traduzione, per dll / so o qualcosa di completamente diverso?

Ci sono momenti in cui <=>?

Sono principalmente interessato ai compilatori per Windows, ma anche qualsiasi informazione per Linux e altre piattaforme è apprezzata.

È stato utile?

Soluzione

  

Ci sono momenti in cui & amp; typeid (T)! = & amp; typeid (T)?

     

Sono principalmente interessato ai compilatori per Windows, ma anche qualsiasi informazione per Linux e altre piattaforme è apprezzata.

Sì. Pertanto, in Windows DLL non possono essere presenti simboli non risolti. Se hai:

foo.h

struct foo { virtual ~foo() {} };

dll.cpp

#include "foo.h"
...
foo f;
cout << &typeid(&f) << endl

main.cpp

<*>

Ti darebbe diversi puntatori. Perché prima che la dll fosse caricata, dovrebbe esistere typeid (pippo) sia in dll che in exe

Inoltre, sotto Linux, se l'eseguibile principale non fosse compilato con -rdynamic (o --export-dynamic), typeid verrebbe risolto in diversi simboli nell'eseguibile e nell'oggetto condiviso (che di solito non accade nelle piattaforme ELF) a causa di alcune ottimizzazioni apportate durante il collegamento dell'eseguibile - rimozione di simboli non necessari.

Altri suggerimenti

Gli standard a volte lasciano determinati comportamenti non specificati al fine di dare un po 'di libertà alle implementazioni. In questo caso, il modo in cui i TypeID sono gestiti viene lasciato all'implementazione del compilatore e ti viene semplicemente data una serie di regole (essenzialmente: non preoccuparti di come viene allocata la memoria per questo).

C'è qualche motivo particolare per cui devi essere in grado di confrontare TypeIds in base al loro indirizzo di memoria? TypeIds ha già la precedenza == e! = Al fine di fornirti la possibilità di confrontarli e fornire un nome () che potrebbe essere utilizzato per identificarli in modo univoco.

Se hai il linguaggio di programmazione C ++ (Bjarne Stroustrup) disponibile, il capitolo 15 contiene molti dettagli sulla gestione delle gerarchie di classi. Forse potresti trovare un'altra soluzione lì?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top