Jon*_*röm 41 c++ assembly exception-handling try-catch
在心理上,当C++编译将其转换为汇编程序时,我总是想知道try/throw/catch在幕后是怎么看的.但是因为我从来没有使用它,所以我从来没有去过它(有些人会说懒惰).
是用于跟踪try
s 的普通堆栈,还是仅为此目的而保留的单独的每线程堆栈?MSVC和g ++之间的实现是大还是小?请告诉我一些伪asm(IA-32也可以)所以我永远不必自己查看!:)
编辑:现在我了解了基于IA-32处理的MSVC实现的基础知识.任何人都知道在IA-32或其他任何CPU上的g ++?
Ira*_*ter 21
当输入try子句时,异常处理程序的不良实现会为运行时堆栈上的每个try子句推送某种异常处理程序块,并在退出try子句时将其弹出.还保持保存最近推送的异常处理程序块的地址的位置.通常,这些异常处理程序链接在一起,因此可以通过从最新版本到旧版本的链接找到它们.当发生异常时,找到指向最后推送的EH处理程序块的指针,并检查该"try"子句的EH情况的处理.对EH情况的命中导致堆栈清理发生回到推送的EH点,并且控制转移到EH情况.EH上没有命中导致找到下一个EH,并且该过程重复进行.Windows 32位SEH方案就是这个版本的一个版本.
这是一个糟糕的实现,因为程序为每个try子句支付运行时价格(push then pop),即使没有发生异常也是如此.
好的实现只是记录一个try子句出现的范围表.这意味着进入/退出try子句的开销为零.(我的PARLANSE parallell编程语言使用这种技术).查找表中异常点的PC的异常,并将控制权传递给表所选的EH.EH代码根据需要重置堆栈.快而美.我认为Windows 64位EH属于这种类型,但我没有仔细看过.
归档时间: |
|
查看次数: |
11308 次 |
最近记录: |