首页 >后端开发 >C++ >C 中的异常如何在内部运行?

C 中的异常如何在内部运行?

Linda Hamilton
Linda Hamilton原创
2024-10-24 07:32:02213浏览

How Do Exceptions Operate Internally in C  ?

C 中异常如何在幕后工作

简介:

异常经常受到质疑为了他们的效率。本文探讨了 C 语言中异常的复杂工作原理,以全面了解其执行过程。

异常处理机制:

异常并不直接类似于重复执行返回;它们涉及额外的异常表层。当抛出异常时,编译器会生成对 __cxa_throw 的调用,它利用这些表来查找处理程序并展开堆栈,直到到达适当的处理程序。

抛出异常:

抛出异常需要大量的运行时开销,因为:

  • __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 编译此代码会产生以下程序集输出:

  1. 抛出异常:

    _Z20my_throwing_functionb:
     ...
     movl    , (%esp)
     call    __cxa_allocate_exception
     ...
     movl    %eax, (%esp)
     call    __cxa_throw
     ...
  2. 异常处理表:

    .section    .gcc_except_table,&quot;a&quot;,@progbits
    .LLSDATT9:
     ...
     .uleb128 .LEHB1-.LFB9
     .uleb128 .LEHE1-.LEHB1
     .uleb128 .L12-.LFB9
     .uleb128 0x1
     ...

结论:

异常需要大量处理和展开的开销,而返回值产生的费用最小。异常对于特殊场景来说是最佳选择,但应谨慎使用以避免性能下降。

以上是C 中的异常如何在内部运行?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn