sjlj vs dwarf vs seh有什么区别?

我无法find足够的信息来决定使用哪个编译器来编译我的项目。 在不同的计算机上有几个程序模拟一个进程。 在Linux上,我正在使用GCC。 一切都很好。 我可以优化代码,它编译速度快,使用不太多的内存。

我用MSVC和GCC编译器做我自己的基准testing。 稍后会产生稍微更快的二进制文件(对于每个子体系结构)。 虽然编译时间比MSVC多得多。

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

注意事项:

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

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

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

Windows的Dwarf-2 EH实现根本不能在64位Windows应用程序中工作。 在win32模式下,exception展开处理程序不能传播通过非dw2知道的代码,这意味着任何exception通过任何非dw2知道的“外部框架”代码将失败,包括Windows系统DLL和Visual Studio构build的DLL。 gcc中的dwarf-2展开代码检查x86展开程序集,如果没有其他的dwarf-2展开信息,将无法继续。

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

GCC GNU关于exception处理

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

  • DWARF-2(DW2)EH ,它需要使用DWARF-2(或DWARF-3)debugging信息。 DW-2 EH可能导致可执行文件稍微膨胀,因为大量调用堆栈展开表必须包含在可执行文件中。
  • 基于setjmp / longjmp(SJLJ)的方法 。 基于SJLJ的EH比DW2 EH要慢得多(当没有exception抛出时,甚至可以正常执行),但是可以在没有使用GCC编译或没有调用堆栈解除信息的代码上工作。

[…]

结构化exception处理(SEH)

Windows使用自己的称为结构化exception处理(SEH)的exception处理机制。 不幸的是,GCC还不支持SEH。 […]

也可以看看:

  • GCC的exception处理模型
  • IA-64的C ++exception处理
  • EH新手如何

SJLJ (setjmp / longjmp): – 可用于32位和64位 – 不是“零成本”:即使不抛出exception,也会造成较小的性能损失(在exception大的代码中约为15%) – 允许exception遍历例如窗口callback

DWARF (DW2,dwarf-2) – 只有32位可用 – 没有永久的运行时间开销 – 需要整个调用堆栈被启用,这意味着exception不能被抛出,例如Windows系统DLL。

SEH (零开销exception) – 将可用于64位GCC 4.8。

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