当前位置:  开发笔记 > 编程语言 > 正文

GCC的异常处理模型

如何解决《GCC的异常处理模型》经验,为你挑选了2个好方法。

GCC支持Setjump-longjump(sjlj)和基于Dwarf2表的展开(dw2)异常处理模型.这两个模型之间有什么区别以及如何选择合适的模型?为什么Dwarf2基于表的展开(dw2)是更有效的模型?据我所知,这两个模型不能混在一起.

参考:技术预览:gcc-4.2.1-sjlj -2



1> Johannes Sch..:

好吧,dwarf2为每个函数构建表,包含被调用者保存的寄存器以及它们保存在堆栈中的位置,以及callstack中的帧指针/返回地址以及其他一些内容.如果使用dwarf2,编译器可以使用这些信息并有效地恢复寄存器,并在发生异常时跳回调用者.后端需要在其实现的序言生成代码中提供信息,告诉GCC哪些寄存器是被调用者保存的,以及何时保存帧指针等等.

使用setjmp/longjmp只是一个黑客.由于setjmp/longjmp不知道函数throw的结构,它将恢复由setjmp保存在跳转缓冲区中的所有寄存器,即使它们没有被throw函数覆盖.我不是真正的专家,但我认为这显然不会有效.此外,每次启动try块时,都必须调用setjmp来设置包含已保存寄存器的缓冲区,而在使用dwarf2时,编译器已在编译时提供所有必要的信息.

如果后端没有提供必要的信息,GCC将自动回退到基于setjmp/longjmp的异常处理.

注意我不是GCC专家.我刚把工具链移植到我教授的一些简单的处理器上,包括GCC.我希望我能帮助你一点.



2> 小智..:

避免使用sjlj.每个"try"块都会调用setjmp来保存寄存器,即使没有引发异常,性能也会受到影响.使用表格,正常的控制流程不会产生执行成本.只有在引发异常时,异常处理机制才必须遍历表格以确定要执行的操作.

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有