异常处理

有人说从 Cfront 转向专门的 C++ 编译器的一大原因就是支持异常处理,因为异常处理在 C 语言中很难做。

一个函数的指令区域分成三种:

  1. try 以外,且没有活跃对象
  2. try 以外,有活跃对象,发生异常时需要析构
  3. try 以内

有一个活跃对象和两个活跃对象应该会有区别吧?这样制表/查表的压力很大。

发生异常时把 PC 寄存器(在 x64 上是 rip)的值拿去查表,若在 try 区段中且能够被接受则进入异常处理,否则析构活跃对象并退栈。然后到下一层检查是否能处理异常。