C++最简单的RTI实现是什么?

C++最简单的RTI实现是什么?,c++,exception-handling,rtti,C++,Exception Handling,Rtti,我正在尝试为嵌入式操作系统实现异常处理,我一直在研究如何检测抛出的异常类型以选择合适的处理程序 异常处理的保存和恢复上下文部分已经完成,但是我无法拥有特定的句柄,因为我无法检测抛出的“异常”的类型。C++的标准RTTI实现太依赖其他库,因此我认为它不可用。 考虑到我的目标是一个嵌入式系统,并且由于这个原因我不能创建太多的代码,我能获得或生成的运行时类型信息的最小实现是什么 -编辑- 我不是在编写编译器,它是一个ia32-g++。我能想到的最简单的RTTI是从一个具有纯虚拟GetType函数的公共

我正在尝试为嵌入式操作系统实现异常处理,我一直在研究如何检测抛出的异常类型以选择合适的处理程序

异常处理的保存和恢复上下文部分已经完成,但是我无法拥有特定的句柄,因为我无法检测抛出的“异常”的类型。C++的标准RTTI实现太依赖其他库,因此我认为它不可用。 考虑到我的目标是一个嵌入式系统,并且由于这个原因我不能创建太多的代码,我能获得或生成的运行时类型信息的最小实现是什么

-编辑-


我不是在编写编译器,它是一个ia32-g++。

我能想到的最简单的RTTI是从一个具有纯虚拟GetType函数的公共基派生所有类。要么让它返回一个字符串,要么创建一个包含所有类型的大型枚举。它非常简单,速度快,内存开销低。但是,灵活性不是特别强。

当您在嵌入式环境中工作时,您可能会倾向于使用非常简单的解决方案,并且可以利用编译器的非标准或不可移植特性

如果一个类是多态的,在C++中至少有一个虚拟函数,它可能有一个指向它里面的VTABLE的指针。可能是vtable指针出现在内存中对象布局的开头

<>这是很多编译器的真实用法,使用C++ abi-.< /p>的编译器是这样的。 如果是这样的话,您可能可以获得如下vtable:

void *get_vtable(void *obj)
{
    return *(reinterpret_cast<void **>(obj));
}
P p;
Q q;
if (get_vtable(caught) == get_vtable(&p))
{
    // it's a P...
}
else if (get_vtable(caught) == get_vtable(&q))
{
    // it's a Q...
}
可以在CATCH宏中隐藏该模式

要点-如果您从基类派生一个类,但派生类没有重写任何虚拟函数或添加任何新的虚拟函数,那么编译器可以为派生类重用基类的vtable。这意味着为了区分两种异常类型,它们必须各自重写一个虚拟函数,以确保它们有自己的vTable


请注意,这只是异常处理所涉及的一小部分。还有一个小问题就是展开堆栈!跳转到处理程序时,需要调用堆栈上所有对象的析构函数。这不仅仅是执行setjmp/longjmp的问题。

当然,对于虚拟函数的存在,您可能会使用某种虚拟函数指针表。不知何故,它可以被用于rtti…虽然比巨型枚举方法更复杂一些;还应该增加一点跨平台的功能。。。找到那些vtable可能是一项非常艰苦的工作。我的意思是:如何在不使用vfprtable的情况下实现抽象的虚拟函数GetType?你说,你用虚拟函数实现RTTI,但是对于虚拟函数,你已经需要某种RTTI了。我认为这有点遥不可及。系统中的对象太多。但是对于较小的静态开发来说,这是一个很好的选择。您是在编写/修改编译器还是语言运行时,或者您将在哪里安装它?如果内存有限,就不应该启用RTTI,甚至不应该尝试使用异常。最好考虑另一种方法。如果抛出了异常,那么throw nust在某种程度上编码了异常类型信息,所以我不明白为什么需要其他方法。正如jalf所说,请提供更多关于您实际尝试执行的操作的信息。您能否展示一种在第一个代码中获取“ptr”的方法?我也不明白“obj”的角色。对不起,那是个打字错误。它只是一个指向多态类型对象的指针。