mingw32 exception在sjlj与dwarf差别-反汇编分析
sjlj (setjump/longjump)与dwarf-2为mingw32两种异常处理模型的实现。sjlj有着开销,而随linux发行的mingw32开发库包都是用sjlj版编译的,而Qt却采用dwarf-2版,那么两者之间有多少差异,本文就这问题对两版的异常代码的反汇编进行分析比较。 我使用mingw-w65-i686-810的sjlj与dwarf-2两个版本对下面异常代码编译。 __attribute__((dllimport)) int dllfunc(); int main() { dllfunc(); // _create_locale(LC_ALL, "C"); printf( " abc " ); // return 0; try { try { throw std::exception(); } catch (std::exception& ) { std::rethrow_exception(std::current_exception()); } } catch ( int ) { } catch (std::exception& e) { std::cout << e.what() << std::endl; } catch (...) { std::cout << " unknown " << std::endl; } return 0 ; }