11

Andrei Alexandrescu在Modern C++ Design中写道:

返回的对象typeid具有静态存储,因此您不必担心生命周期问题。

安德烈继续说:

该标准不保证每次调用typeid(int) 都会返回对同一 type_info对象的引用。

尽管标准不保证这一点,但在 GCC 和 Visual Studio 等常见编译器中是如何实现的?

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

有时间&typeid(T) != &typeid(T)吗?

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

4

2 回答 2

11

有没有 &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

主文件

#include "foo.h"
...
foo f;
cout << &typeid(&f) << endl

会给你不同的指点。因为在加载 dll 之前 typeid(foo) 应该存在于 dll 和主 exe 中

More then that, under Linux, if main executable was not compiled with -rdynamic (or --export-dynamic) then typeid would be resolved to different symbols in executable and in shared object (which usually does not happen under ELF platforms) because of some optimizations done when linking executable -- removal of unnecessary symbols.

于 2009-12-28T10:20:13.387 回答
1

标准有时会留下未指定的某些行为,以便为实现提供一些自由。在这种情况下,如何管理 TypeID 将留给编译器实现,并且您只需获得一组规则(本质上:不要关心如何分配内存)。

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

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

于 2009-11-30T11:06:18.397 回答