c++中的运行时自省-它是如何在内部工作的?



我正在寻找关于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对象。

其他实现可能不同。

相关内容

  • 没有找到相关文章

最新更新