本地环境放弃了sjlj异常处理方法,转而使用基于表的新方法,因为后者在没有抛出异常时的时间开销为零。
但是,我仍然希望使用sjlj方法。(因为当抛出异常时,基于表的方法的时间成本非常高。)
我知道Visual C++不允许我退出基于表的方法,但我希望自由世界更保守,将保留旧的方法作为一个选项。看来我错了,因为我找不到选项来编译sjlj,而不是在gcc中,也不是在clang中。我错过了这些选项,还是他们真的不再支持sjlj了?
有趣的是,基于gcc的gnat,looks to still keep the option。
1条答案
按热度按时间oalqel3c1#
Windows上的gcc使用SJLJ异常处理,而Linux上的gcc使用DWARF-2 EH。引自GCC Wiki:
像Linux x86-32这样的平台已经转移到DW 2 EH,但是Windows仍然坚持使用SJLJ EH。这是因为Windows开发人员经常编写Windows GUI应用程序,他们希望他们的事件循环能够捕获回调函数中抛出的异常。不幸的是,这在像Java这样的异常非常常见的环境中会带来严重的损失。
然而,gcc可以是configured(正如@MarcGlisse所指出的)以启用sjlj异常。