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

dal*_*lle 10 c++ compiler-construction language-design rtti typeid

Andrei AlexandrescuModern C++ Design中写道:

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

安德烈继续说:

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

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

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

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

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

Art*_*yom 10

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

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

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

foo.h中

struct foo { virtual ~foo() {} };
Run Code Online (Sandbox Code Playgroud)

dll.cpp

#include "foo.h"
...
foo f;
cout << &typeid(&f) << endl
Run Code Online (Sandbox Code Playgroud)

main.cpp中

#include "foo.h"
...
foo f;
cout << &typeid(&f) << endl
Run Code Online (Sandbox Code Playgroud)

会给你不同的指针.因为在加载dll之前,typeid(foo)应该同时存在于dll和primary exe中

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