我正在寻找关于c++中运行时内省如何工作的信息。
到目前为止我所发现的是,附加信息将作为每个类型的运行时类型信息(RTTI)存储。我找不到这个信息是以什么形式存储的,也找不到它是如何被检查或访问的。
思考一下,如果我们有两个非常相似的类型,那么内省是如何工作的,例如:
class TypeOne {
string name;
}
class TypeTwo {
string name;
}
哪些信息将被准确地存储在内存中,以便我们可以通过自省来区分这两种类型?
TL;博士查找有关如何实现内省的更多信息。
编辑1:让我们明确一点,我不需要知道如何使用内省,而是知道如何实现它。编译器如何生成RTTI信息?它是否存储在每个实例化的对象中?最后,RTTI是如何在运行时相互比较的?
至少对于g++,通过查看生成的汇编代码可以很容易地了解typeinfo是如何实现的。对于如下程序:
#include <typeinfo>
#include <stdio.h>
int main() {
printf("%pn", &typeid(main));
}
你
.weak _ZTSFivE
.section .rodata._ZTSFivE,"aG",@progbits,_ZTSFivE,comdat
.type _ZTSFivE, @object
.size _ZTSFivE, 5
_ZTSFivE:
.string "FivE"
.weak _ZTIFivE
.section .data.rel.ro._ZTIFivE,"awG",@progbits,_ZTIFivE,comdat
.align 8
.type _ZTIFivE, @object
.size _ZTIFivE, 16
_ZTIFivE:
.quad _ZTVN10__cxxabiv120__function_type_infoE+16
.quad _ZTSFivE
所以对于这里的typeid,它在'comdat'部分创建了一个带有弱符号的小(2字)只读对象,以及一个看起来像一个混乱的名称的字符串(也是一个弱符号)。这意味着,如果在多个编译单元中创建相同的对象,它们将被组合成单个公共对象。因此,对于程序中任何地方使用typeid引用的每种不同类型,最终只会得到一个typeinfo对象。
其他实现可能不同。