C 中異常如何在幕後工作
簡介:
簡介:異常經常受到質疑他們的效率。本文探討了 C 語言中異常的複雜工作原理,以全面了解其執行過程。
異常處理機制:異常並不直接類似於重複執行回傳;它們涉及額外的異常表層。當拋出異常時,編譯器會產生對 __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 程式碼說明了異常處理的指令產生:
產生的程式集:在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中文網其他相關文章!