C++ 异常处理程序

C++ 异常处理程序,c++,exception-handling,g++,C++,Exception Handling,G++,有以下代码: char text[] = "zim"; int x = 777; 如果我查看放置x和文本的堆栈,则输出为: 09 03 00 00 7a 69 6d 00 其中: 09 03 00 00=0x309=777AFAICT,这是指向“展开表”的指针。根据,该过程“[使用]一个展开表,[查找]有关如何处理在该PC上发生的异常的信息,特别是,获取该地址范围的个性化例程的地址。” 展开表背后的思想是很少使用堆栈展开所需的数据。因此,将指针放在堆栈上,并将数据存储在另一个页面中更有效。

有以下代码:

char text[] = "zim";
int x = 777;
如果我查看放置x和文本的堆栈,则输出为:

09 03 00 00 7a 69 6d 00
其中:


  • 09 03 00 00=0x309=777AFAICT,这是指向“展开表”的指针。根据,该过程“[使用]一个展开表,[查找]有关如何处理在该PC上发生的异常的信息,特别是,获取该地址范围的个性化例程的地址。”


    展开表背后的思想是很少使用堆栈展开所需的数据。因此,将指针放在堆栈上,并将数据存储在另一个页面中更有效。在最好的情况下,该页面可以保留在磁盘上,甚至不需要加载到RAM中。相比之下,C风格的错误处理通常会在一级缓存中结束,因为它都是内联的。

    不用说,所有这些都是依赖于平台的,等等

    这可能是一个地址。它可以指向代码段(某些处理程序地址)或数据段(指向生成时生成的具有帧信息的结构的指针),也可以指向同一线程的堆栈(指向运行时生成的帧信息表的指针)。 或者它也可能是垃圾,由于EH可能要求的对齐要求而留下


    例如,在Win32/x86上就没有这样的差距。对于使用异常处理的每个函数(具有
    try/catch
    \uuuuuu try/\uuuu,除了/\uuu finally
    或具有d'tor的对象),编译器生成一个
    exception\u记录
    结构,该结构在堆栈上分配(通过函数prolog code)。然后,每当函数中发生变化时(对象被创建/销毁,
    try/catch
    block entered/exit),编译器就会添加一条指令来修改此结构(更准确地说,修改其扩展名)。但是堆栈上没有分配更多的内容。

    请参阅,这说明了您想知道的原因。即使我们给了你一个答案,它将是特定于编译器和特定版本的编译器。从技术上说,它不是C++问题。这是一个关于g++及其工作原理的问题。除非你真的在为G++编写扩展,否则完全是无用的知识。@洛基斯塔里:G++和其他C++编译器的NIX使用最多的PLANS(根据平台的一些修改),所以它不是平台/编译器特定的。不过,知道如何实现异常处理机制还是很有意思的。@MatteoItalia:让我担心的是根据平台进行的位
    修改(而做出第一个假设是个坏主意)。作为一名编译器编写者,我发现异常实现非常有趣。甚至我也不在乎堆栈上的4个字节代表什么(我打赌它是指向结构的指针)。这些知识只有在更广泛的背景下才有用,而在信息变得稍微有意义之前,这些背景需要更多的专业知识。但是,作为一个普通的C++程序员或初学者,知识是无用的。@洛基斯塔里:也许你是对的。实际上,如果我对像他这样的异常处理实现感到好奇,我只会看看相关的ItAithAB部分,而不必涉及到单个指针的复杂细节。
    
    char text[] = "zim";
    try{
      int x = 777;
    }
    catch(int){
    }
    
    09 03 00 00 **97 85 04 08** 7a 69 6d 00
    
    09 03 00 00 **97 85 04 08** **xx xx xx xx** 7a 69 6d 00