什么时候typeid可以为同一类型返回不同的type_info实例?

时间:2009-11-30 10:55:52

标签: c++ language-design rtti typeid compiler-construction

Andrei AlexandrescuModern C++ Design中写道:

  

typeid返回的对象有   静态存储,所以你不必   担心终身问题。

安德烈继续说道:

  

该标准不保证   每次调用,例如typeid(int)   返回对相同的引用   type_info对象。

即使标准不能保证这一点,如何在常见的编译器中实现,例如GCC和Visual Studio?

假设typeid没有泄漏(并且每次调用都返回一个新实例),每个应用程序,每个翻译单元,每个dll / so或者完全不同的东西,它是一个“表”吗?

是否有时间&typeid(T) != &typeid(T)

我主要对Windows的编译器感兴趣,但是对于Linux和其他平台的任何信息也很感激。

2 个答案:

答案 0 :(得分:10)

  

是否有时候& typeid(T)!=& typeid(T)?

     

我主要对Windows的编译器感兴趣,但是对于Linux和其他平台的任何信息也很感激。

是。在windows下DLL不能有未解析的符号,因此。如果你有:

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

会给你不同的指针。因为在加载dll之前,应该存在typeid(foo) 在dll和主要exe中都是

然后,在Linux下,如果主可执行文件未使用-rdynamic(或--export-dynamic)编译,那么typeid将被解析为可执行文件中的不同符号 在共享对象中(通常不会在ELF平台下发生),因为在链接可执行文件时进行了一些优化 - 删除了不必要的符号。

答案 1 :(得分:1)

标准有时会使某些行为未指定,以便为实现提供一些自由。在这种情况下,管理TypeID的方式是由编译器实现完成的,而您只是被赋予一组规则(基本上:不关心如何分配内存)。

您是否有任何特殊原因需要能够根据内存地址比较TypeIds? TypeIds已经覆盖==和!=,以便为您提供比较它们的能力,并提供可用于唯一标识它们的名称()。

如果你有C ++编程语言(Bjarne Stroustrup),第15章有很多关于处理类层次结构的细节。也许你可能会在那里找到另一种解决方案?