2009-11-30 40 views
9

Andrei Alexandrescu中写道Modern C++ Design什么时候可以typeid返回不同类型的type_info实例?

通过typeid返回的对象具有 静态存储,所以你不必 担心寿命问题。

安德烈继续说:

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

即使标准不能保证这一点,这是如何在普通的编译器中实现的,比如GCC和Visual Studio?

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

有没有时间&typeid(T) != &typeid(T)

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

+3

这种自由度的一个重要原因确实是DLL的问题。 – MSalters 2009-12-01 09:48:46

回答

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的(富)应该存在于DLL和主EXE

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

1

标准有时会留下某些不明确的行为,以便给予实现一些自由。在这种情况下,TypeIDs是如何管理的,留给编译器实现,你只是被赋予了一组规则(本质上:不关心如何分配内存)。

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

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

+3

你有很多优点,但是这不能回答我的问题。我不需要比较地址,我完全对如何在编译器内部处理它感兴趣。 但我在这个问题上的主要兴趣是编译器设计的问题:它是如何以及为什么以这种方式实现的。 为问题添加附加标签。 – dalle 2009-11-30 11:32:57

相关问题