异常处理
有人说从 Cfront 转向专门的 C++ 编译器的一大原因就是支持异常处理,因为异常处理在 C 语言中很难做。
一个函数的指令区域分成三种:
- try 以外,且没有活跃对象
- try 以外,有活跃对象,发生异常时需要析构
- try 以内
有一个活跃对象和两个活跃对象应该会有区别吧?这样制表/查表的压力很大。
发生异常时把 PC 寄存器(在 x64 上是 rip)的值拿去查表,若在 try 区段中且能够被接受则进入异常处理,否则析构活跃对象并退栈。然后到下一层检查是否能处理异常。
有人说从 Cfront 转向专门的 C++ 编译器的一大原因就是支持异常处理,因为异常处理在 C 语言中很难做。
一个函数的指令区域分成三种:
有一个活跃对象和两个活跃对象应该会有区别吧?这样制表/查表的压力很大。
发生异常时把 PC 寄存器(在 x64 上是 rip)的值拿去查表,若在 try 区段中且能够被接受则进入异常处理,否则析构活跃对象并退栈。然后到下一层检查是否能处理异常。