2013-03-27 681 views
112

我无法找到足够的信息来决定使用哪个编译器来编译我的项目。在不同的计算机上有几个程序模拟一个过程。在Linux上,我使用GCC。一切都很好。我可以优化代码,它可以快速编译并使用不太多的内存。sjlj vs dwarf vs seh有什么区别?

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

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

注意事项:

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

我很惊讶,GCC可产生更快的代码比MSVC;在过去的几年里,事情一定会改变...... – trojanfoe 2013-03-27 21:52:56

+15

@trojanfoe我曾多次被告知使用MSVC而不是MinGW。大家都认为msvc更快!我用一个简单的cpu-burst程序测试了MinGW 7.2和MSVC 2010.与corei7'-O3 -mtune = corei7' GCC比MSVC – 2013-03-27 21:57:27

+4

快45%,在我自己的经验,有一步棋发生器(其中使用位棋盘),都MSVC和英特尔C++比GCC快10%,但这是2年前... – trojanfoe 2013-03-27 22:04:38

回答

78

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

为什么不MinGW的-W64 GCC支持矮2异常处理?

用于Windows的矮2 EH实现并不在64位Windows应用程序在所有旨在 工作。在win32模式下,异常 展开处理程序无法通过非dw2知道代码传播,这意味着 任何异常会通过任何非dw2知道的“外部框架” 代码将会失败,包括Windows系统DLL和使用 构建的DLL工作室。在GCC矮2退绕代码检查在x86 退绕组件,并且不能没有其他矮化-2 展开信息进行。

SetJump LongJump异常处理方法适用于除win32和win64以外的大多数 情况(一般保护错误除外)。 gcc的结构化异常处理支持正在开发到 ,克服了dw2和sjlj的弱点。 Win64上,所述 展开信息被放置在XDATA截面并且在.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)自己的异常处理机制。 [...] 不幸的是,GCC还不支持SEH。 [...]

参见:

+7

感谢您的链接。我将使用32位的DW2和64位的SEH。SEH在mingwbuild(4.8)中可用。我应该等待4.8的稳定版本还是没问题?它在这里编译。我目前正在使用SEH对4.8的项目进行依赖项。没问题... – 2013-03-28 16:00:53

+5

我猜你已经可以使用4.8了。 – ollo 2013-03-28 18:48:34

+2

所有相关性(包括Boost库,OpenSSL的,ICU,freeGLUT)编译但Qt的结束,有很多内部编译器错误。我想我会等待4.8 – 2013-03-28 21:35:51

61

SJLJ(的setjmp/longjmp的) : - 对于32位和64位 - 不为“零成本”:即使不引发异常,但这样会导致较小的 性能损失(〜异常代码重15%) - 允许例外 通过例如遍历窗口回调

DWARF(DW2,矮-2) - 仅可用于32位 - 没有永久运行时开销 - 需要整个调用栈是启用矮,这意味着 异常不能扔过例如Windows系统DLL。

SEH(零开销例外) - 将可用于64位GCC 4.8。

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

+2

对不起,源链接添加 – 2013-03-27 22:02:58

+2

谢谢为您的答案;) – 2013-03-27 22:03:32

+4

因此,现在在2016年,我们可以把这个问题休息,只是总是使用SEH。 – rustyx 2016-05-13 19:55:23

相关问题