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

¿Fue útil?

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í?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top