繁体   English   中英

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

[英]Runtime introspection in C++ - How does it work internally?

我正在寻找有关 C++ 中运行时内省如何工作的信息。

到目前为止,我发现附加信息将存储为每种类型的运行时类型信息 (RTTI)。 我找不到此信息的存储形式或检查或访问方式。

考虑一下如果我们本身有两种非常相似的类型,内省是如何工作的,例如:

class TypeOne {
  string name;
}

class TypeTwo {
  string name;
}

哪些信息将准确存储在内存中,以便我们通过内省区分这两种类型?

TL;DR寻找有关如何实施内省的更多信息。

编辑 1:让我们明确一点,我不需要知道如何使用自省,而是需要知道它是如何实现的。 编译器如何生成RTTI信息? 它是按每个实例化的对象存储的吗? 最后,如何在运行时比较 RTTI?

至少对于 g++,通过查看生成的汇编代码很容易看出 typeinfo 是如何实现的。 对于像这样的程序:

#include <typeinfo>
#include <stdio.h>

int main() {
    printf("%p\n", &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 对象。

其他实现可能不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM