在32位Windows(至少使用Microsoft编译器)中,使用在调用堆栈上动态分配的异常帧堆栈来处理异常is implemented; TIB条目指向异常堆栈的顶部。每个函数的运行时成本是几个PUSH
/ POP
指令,需要处理异常,将异常处理程序访问的变量溢出到堆栈上,并且在处理异常时,进行简单的链表遍历。
在64-bit Windows和Itanium / System V x86-64 ABI中,展开都使用大的排序列表来描述内存中的所有功能。每个every函数的运行时开销是一些表(不只是涉及异常处理的表),动态生成的代码的运行成本为complications,并且在处理异常时,每个活动函数在函数列表中遍历一次无论如何] >是否与异常有关。
后者比前者好吗?我知道为什么Itanium模型在一般情况下比基于setjmp
/ longjmp
的传统UNIX便宜,但是在32位Windows中,有几个PUSH
和POP
加上一些寄存器溢出,却没有对于它提供的(看似)更快,更简单的处理来说,似乎还不错。 (IIRC,Windows API调用通常会占用Ks的堆栈空间,因此,我们通过强制将这些数据输出到表中并不会获得任何收益。)
在32位Windows(至少使用Microsoft编译器)中,使用在调用堆栈上动态分配的异常帧堆栈来实现异常处理;异常堆栈的顶部是...
除了优化幸福的情况之外,也许还存在缓冲区溢出漏洞可能在异常中公开信息的问题。如果此信息被破坏,可能会严重混淆用户,甚至可能导致进一步的错误(请记住,如果引发另一个异常,则调用std :: terminate()。)