sjlj vs dwarf vs srh有什么区别?

时间:2013-03-27 21:48:15

标签: c++ compiler-construction mingw cpu-architecture mingw-w64

我找不到足够的信息来决定我应该使用哪个编译器来编译我的项目。模拟一个过程的不同计算机上有几个程序。在Linux上,我正在使用GCC。一切都很棒。我可以优化代码,它可以快速编译并使用不那么多的内存。

我使用MSVC和GCC编译器做自己的基准测试。后来一个产生稍快的二进制文件(对于每个子体系结构)。虽然编译时间远远超过MSVC。

所以我决定使用MinGW。但是在MinGW中找不到有关异常处理方法及其实现的任何解释。我可以为不同的操作系统和体系结构使用不同的发行版。

注意事项:

  • 编译时间和内存对我的使用并不重要。唯一重要的是运行时优化。我需要我的程序足够快。慢编译器是可以接受的。
  • 操作系统:Microsoft Windows XP / 7/8 / Linux
  • 架构:英特尔酷睿i7 / Core2 /以及运行XP的非常老的i686:P

2 个答案:

答案 0 :(得分:94)

MinGW-w64 Wiki处有一个简短的概述:

  

为什么mingw-w64 gcc不支持Dwarf-2异常处理?

     

Windows的 Dwarf-2 EH 实现根本不是设计的   在64位Windows应用程序下工作。在win32模式下,异常   unwind处理程序无法通过非dw2识别代码传播,这意味着   通过任何非dw2识别的“外国帧”的任何异常   代码将失败,包括Windows系统DLL和使用它构建的DLL   视觉工作室。 gcc中的Dwarf-2展开代码检查x86   展开组件,没有其他矮人2就无法继续   展开信息。

     

异常处理的 SetJump LongJump 方法适用于大多数人   除了一般保护错误之外,win32和win64都有案例。   正在开发gcc中的结构化异常处理支持   克服了dw2和sjlj的弱点。在win64上,   展开信息放在xdata-section中,并且有.pdata   (函数描述符表)而不是堆栈。对于win32,链   处理程序处于堆栈状态,需要通过实际保存/恢复   执行代码。

GCC GNU关于异常处理

  

GCC支持两种异常处理方法(EH):

     
      
  • DWARF-2(DW2)EH ,需要使用DWARF-2(或DWARF-3)调试信息。 DW-2 EH可以导致可执行文件   稍微膨胀,因为必须有大的调用堆栈展开表   包含在可执行文件中。
  •   
  • 基于 setjmp / longjmp(SJLJ)的方法。基于SJLJ的EH比DW2 EH慢得多(当没有时,惩罚甚至正常执行)   抛出异常),但可以跨越尚未执行的代码   使用GCC编译或没有调用堆栈展开   信息。
  •   
     

[...]

     

结构化异常处理(SEH)

     

Windows使用自己的异常处理机制,称为结构化异常处理(SEH)。 [...]   不幸的是,海湾合作委员会尚未支持SEH。 [...]

另见:

答案 1 :(得分:71)

  

SJLJ (setjmp / longjmp): - 可用于32位和64位 - 不是“零成本”:即使没有抛出异常,也会导致未成年人   性能损失(异常重码中约15%) - 允许例外   遍历例如Windows回调

     

DWARF (DW2,dwarf-2) - 仅适用于32位 - 无永久运行时开销 - 需要整个调用堆栈启用为dwarf,   意味着不能抛弃异常,例如Windows系统DLL。

     

SEH (零开销异常) - 可用于64位GCC 4.8。

来源:http://qt-project.org/wiki/MinGW-64-bit