首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sjlj和侏儒对seh的区别是什么?

sjlj和侏儒对seh的区别是什么?
EN

Stack Overflow用户
提问于 2013-03-27 21:48:15
回答 2查看 124.6K关注 0票数 174

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

我用MSVC和GCC编译器做我自己的基准测试。稍后,将生成速度稍快的二进制文件(针对每个子体系结构)。尽管编译时间要比MSVC长得多。

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

考虑因素:

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-28 15:03:34

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

-w64 gcc为什么不支持Dwarf-2异常处理? Windows的Dwarf-2 EH实现根本不适合在64位Windows应用程序下工作。在win32模式下,异常解除处理程序不能通过非DW2识别代码传播,这意味着任何通过任何非DW2感知的“外部框架”代码的异常都将失败,包括用Visual构建的和DLL。gcc中的矮人-2展开码检查x86解卷程序,如果没有其他矮人-2解卷信息,则无法进行。 异常处理的SetJump LongJump方法在大多数情况下都适用于win32和win64,但一般保护故障除外。gcc正在开发结构化异常处理支持,以克服dw2和sjlj的缺陷。在win64上,展开信息被放置在xdata-节中,并且有.pdata (函数描述符表)而不是堆栈。对于win32,处理程序链在堆栈中,需要通过实际执行的代码保存/恢复。

关于异常处理的GCC GNU

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

  • 侏儒-2 (DW2) EH,这就要求使用侏儒-2(或矮人-3)调试信息.DW-2EH会导致可执行文件略微膨胀,因为大型调用堆栈展开表必须包含在可执行文件中。
  • 一种基于setjmp/longjmp (SJLJ)的方法。基于SJLJ的EH比DW2 EH慢得多(即使在没有抛出异常的情况下也会惩罚正常执行),但可以跨没有使用GCC编译的代码或没有调用堆栈展开信息的代码工作。

..。

结构化异常处理(SEH)

Windows使用自己的异常处理机制,称为结构化异常处理(SEH)。..。不幸的是,GCC还不支持SEH。..。

另请参阅:

票数 121
EN

Stack Overflow用户

发布于 2013-03-27 21:55:02

SJLJ (setjmp/longjmp):--可用于32位和64位--而不是“零成本”:即使没有引发异常,也会造成轻微的性能损失(异常重代码为15%)允许异常通过例如windows回调进行遍历。 侏儒 (DW2,侏儒-2)--只有32位才能使用--不需要永久的运行时开销--需要整个调用堆栈才能实现矮化,这意味着不能在Windows上抛出异常。 SEH (零开销例外)-将提供64位GCC 4.8.

来源:https://wiki.qt.io/MinGW-64-bit

票数 92
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15670169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档