Andrei Alexandrescu pg = PA38 <!> dq = typeid + type_info + lifetime #v = onepage <!> q = typeid%20type_info%20lifetime <!> f = false“rel =”noreferrer“>现代C ++设计

  

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

安德烈继续说道:

  

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

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

假设&typeid(T) != &typeid(T)没有泄漏(并且每次调用都返回一个新实例),它是一个<!> quot; table <!> quot;每个应用程序,每个翻译单位,每dll / so,或完全不同的东西?

是否有时间<=>?

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

有帮助吗?

解决方案

  

有时候<!> amp; typeid(T)!= <!> amp; 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

<*>

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

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

其他提示

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top