2009-11-30 11 views
9

Andrei Alexandrescu escribe en Modern C++ Design:¿Cuándo puede typeid devolver diferentes instancias de type_info para el mismo tipo?

Los objetos devueltos por typeid tener almacenamiento estático, por lo que no tiene que preocuparse por problemas de de toda la vida.

Andrei sigue:

La norma no garantiza que cada invocación de, por ejemplo, typeid(int) devuelve una referencia a la misma type_info objeto.

Aunque el estándar no lo garantiza, ¿cómo se implementa esto en compiladores comunes, como GCC y Visual Studio?

Suponiendo que typeid no tiene fugas (y devuelve una nueva instancia en cada llamada), ¿es una "tabla" por aplicación, por unidad de traducción, por dll/so, o algo completamente diferente?

¿Hay momentos en que &typeid(T) != &typeid(T)?

Estoy interesado principalmente en compiladores para Windows, pero también se agradece cualquier información para Linux y otras plataformas.

+3

Una razón importante para este nivel de libertad fue la preocupación por las DLL. – MSalters

Respuesta

10

¿Hay momentos en & typeid (T)! = & typeid (T)?

Estoy interesado principalmente en compiladores para Windows, pero también se agradece cualquier información para Linux y otras plataformas.

Sí. En Windows, DLL no puede tener símbolos no resueltos, por lo tanto. Si usted tiene:

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 

le pondrías a diferentes punteros.Porque antes dll se cargó typeid (foo) debería existir en exe dll y primario

Más que eso, en Linux, si el ejecutable principal no se compiló con -rdinámico (o --export-dynamic), entonces el typeid sería resuelto a diferentes símbolos en 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.

1

Las normas a veces dejan cierto comportamiento no especificado para dar cierta libertad a las implementaciones. En este caso, cómo se administran los TypeID se deja en manos de la implementación del compilador y simplemente se le está dando un conjunto de reglas (esencialmente: no se preocupe por cómo se asigna la memoria para esto).

¿Hay alguna razón en particular por la que deba poder comparar TypeIds en función de su dirección de memoria? Los TypeIds ya anulan == y! = Para proporcionarle la capacidad de compararlos y proporcionar un nombre() que podría usarse para identificarlos de manera única.

Si tiene disponible el Lenguaje de programación C++ (Bjarne Stroustrup), el capítulo 15 contiene muchos detalles sobre el manejo de las jerarquías de clase. ¿Tal vez puedas encontrar otra solución allí?

+3

Tiene muchos puntos buenos, pero esto no responde mi pregunta. No necesito comparar las direcciones, estoy totalmente interesado en cómo se maneja internamente en los compiladores. Pero mis principales intereses en este tema son los del diseño del compilador: cómo y por qué se implementa de esta manera. Agregando etiquetas adicionales a la pregunta. – dalle

Cuestiones relacionadas