C 中异常如何在幕后工作
简介:
异常经常受到质疑为了他们的效率。本文探讨了 C 语言中异常的复杂工作原理,以全面了解其执行过程。
异常处理机制:
异常并不直接类似于重复执行返回;它们涉及额外的异常表层。当抛出异常时,编译器会生成对 __cxa_throw 的调用,它利用这些表来查找处理程序并展开堆栈,直到到达适当的处理程序。
抛出异常:
抛出异常需要大量的运行时开销,因为:
异常返回:
相反,返回值会产生最小的开销。应谨慎使用异常,仅在特殊情况下使用。
示例代码:
以下简单的 C 代码说明了异常处理的指令生成:
<code class="cpp">class MyException { public: MyException() { } ~MyException() { } }; void my_throwing_function(bool throwit) { if (throwit) throw MyException(); } void another_function(); void log(unsigned count); void my_catching_function() { log(0); try { log(1); another_function(); log(2); } catch (const MyException& e) { log(3); } log(4); }</code>
生成的程序集:
在 Linux 上使用 GCC 编译此代码会产生以下程序集输出:
抛出异常:
_Z20my_throwing_functionb: ... movl , (%esp) call __cxa_allocate_exception ... movl %eax, (%esp) call __cxa_throw ...
异常处理表:
.section .gcc_except_table,"a",@progbits .LLSDATT9: ... .uleb128 .LEHB1-.LFB9 .uleb128 .LEHE1-.LEHB1 .uleb128 .L12-.LFB9 .uleb128 0x1 ...
结论:
异常需要大量处理和展开的开销,而返回值产生的费用最小。异常对于特殊场景来说是最佳选择,但应谨慎使用以避免性能下降。
以上是C 中的异常如何在内部运行?的详细内容。更多信息请关注PHP中文网其他相关文章!