![](/img/trans.png)
[英]How does C++ placement delete work internally (C++ runtime)? How to overcome its limitation?
[英]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.