¿Cuándo puede typeid devolver diferentes instancias de type_info para el mismo tipo?
-
10-07-2019 - |
Pregunta
Andrei Alexandrescu escribe en Diseño moderno C ++ :
Los objetos devueltos por
typeid
tienen almacenamiento estático, para que no tenga que preocuparse por problemas de por vida.
Andrei continúa:
El estándar no garantiza que cada invocación de, digamos,
typeid(int)
devuelve una referencia a la mismatype_info
objeto.
Aunque el estándar no garantiza esto, ¿cómo se implementa esto en compiladores comunes, como GCC y Visual Studio?
Suponiendo que &typeid(T) != &typeid(T)
no se filtra (y devuelve una nueva instancia cada llamada), ¿es una " table " por aplicación, por unidad de traducción, por dll / so, o algo completamente diferente?
¿Hay momentos en que <=>?
Me interesan principalmente los compiladores para Windows, pero también se agradece cualquier información para Linux y otras plataformas.
Solución
¿Hay momentos en que & amp; typeid (T)! = & amp; typeid (T)?
Me interesan principalmente los compiladores para Windows, pero también se agradece cualquier información para Linux y otras plataformas.
Sí En Windows, la DLL no puede tener símbolos sin resolver, por lo tanto. Si tienes:
foo.h
struct foo { virtual ~foo() {} };
dll.cpp
#include "foo.h"
...
foo f;
cout << &typeid(&f) << endl
main.cpp
<*>Te daría diferentes punteros. Porque antes de que se cargara dll, debería existir typeid (foo) tanto en dll como en exe primario
Más que eso, en Linux, si el ejecutable principal no se compilara con -rdynamic (o --export-dynamic), typeid se resolvería con diferentes símbolos en el ejecutable y en objeto compartido (que generalmente no ocurre en plataformas ELF) debido a algunas optimizaciones realizadas al vincular ejecutable: eliminación de símbolos innecesarios.
Otros consejos
Los estándares a veces dejan cierto comportamiento sin especificar para darles libertad a las implementaciones. En este caso, la forma en que se administran los TypeID se deja a la implementación del compilador y simplemente se le da un conjunto de reglas (esencialmente: no se preocupe por cómo se asigna la memoria para esto).
¿Hay alguna razón particular por la que necesite poder comparar TypeIds en función de su dirección de memoria? Los TypeIds ya anulan == y! = Para proporcionarle la posibilidad de compararlos y proporcionar un nombre () que podría usarse para identificarlos de forma exclusiva.
Si tiene disponible el lenguaje de programación C ++ (Bjarne Stroustrup), el capítulo 15 tiene muchos detalles sobre el manejo de las jerarquías de clases. ¿Quizás encuentre otra solución allí?