Andrei Alexandrescu在Modern C++ Design中写道:
typeid
返回的对象有 静态存储,所以你不必 担心终身问题。
安德烈继续说道:
该标准不保证 每次调用,例如
typeid(int)
返回对相同的引用type_info
对象。
即使标准不能保证这一点,如何在常见的编译器中实现,例如GCC和Visual Studio?
假设typeid
没有泄漏(并且每次调用都返回一个新实例),每个应用程序,每个翻译单元,每个dll / so或者完全不同的东西,它是一个“表”吗?
是否有时间&typeid(T) != &typeid(T)
?
我主要对Windows的编译器感兴趣,但是对于Linux和其他平台的任何信息也很感激。
答案 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章有很多关于处理类层次结构的细节。也许你可能会在那里找到另一种解决方案?