首頁  >  文章  >  後端開發  >  C 中的異常如何在內部運作?

C 中的異常如何在內部運作?

Linda Hamilton
Linda Hamilton原創
2024-10-24 07:32:02131瀏覽

How Do Exceptions Operate Internally in C  ?

C 中異常如何在幕後工作

簡介:

簡介:

異常經常受到質疑他們的效率。本文探討了 C 語言中異常的複雜工作原理,以全面了解其執行過程。

異常處理機制:

異常並不直接類似於重複執行回傳;它們涉及額外的異常表層。當拋出異常時,編譯器會產生對 __cxa_throw 的調用,它利用這些表來查找處理程序並展開堆疊,直到到達適當的處理程序。

拋出例外:
  • 拋出異常需要大量的運行時開銷,因為:
__cxa_throw 必須定位處理程序並展開堆疊。

執行處理程序後必須銷毀分配的異常.

異常回傳:

相反,回傳值會產生最小的開銷。應謹慎使用異常,僅在特殊情況下使用。

範例程式碼:
<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>

以下簡單的C 程式碼說明了異常處理的指令產生:

產生的程式集:
  1. 在Linux 上使用GCC 編譯此程式碼會產生以下程式集輸出:

    _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