Quando typeid può restituire istanze type_info diverse per lo stesso tipo?
-
10-07-2019 - |
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 stessotype_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.
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ì?