首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 異常處理效能與設計取捨:從 VC6 實作談起

     編輯:關於C語言

參加技術大會聽講 SEH 與 C++ 異常實作,雖未聽到預期內容,但引發對異常機制效能與工程取捨的思考。以下整理 VC6 異常實作特性與個人不使用異常的理由。

VC6 異常處理特性

  • Happy path 無核心 API 呼叫:正常路徑極輕量,效能損失極小。
  • 關閉異常可提升效能:VC6 利用 FS: 段暫存器保存框架資訊,關閉異常(/EHsc-)可省略 prologue/epilogue 代碼,減少程式碼體積與指令快取壓力。
  • Unhappy path 代碼膨脹:所有編譯器為支援堆疊展開會產生大量隱含代碼,ICC/GCC 會將 cold code 置於遠端減少快取污染。

除零異常的誤區

整數除零確會觸發異常,但非數學程式極少用除法,且邏輯通常能保證分母非零;浮點除零產生 INF/NaN 而非異常。以此論證異常優越性說服力有限。

為何選擇不使用異常

  1. 降低複雜度:控制流單一化,減少隱含跳轉,降低認知負擔。
  2. 介面簡潔:錯誤碼/回傳值明確,無需文件說明可能拋出的異常型別。
  3. 效能優勢:無堆疊展開機制,程式碼體積更小,指令快取友善。
  4. 協程相容性:專案大量使用 coroutine,C++ 異常難以跨協程邊界正確展開堆疊。

替代方案:結構化 goto 錯誤處理

int foo() {
    int ret = 0;
    Resource* r1 = acquire1();
    if (!r1) { ret = -1; goto EXIT; }
    Resource* r2 = acquire2();
    if (!r2) { ret = -2; goto RELEASE_R1; }
    // ... 正常邏輯 ...
RELEASE_R1:
    release(r1);
EXIT:
    return ret;
}

集中清理資源,流程清晰,效能可預期,適合系統級開發。

結語

異常機制有其適用場景(如深層呼叫鏈的錯誤傳遞),但在效能敏感、資源受限、大量協程的系統級專案,錯誤碼 + goto 清理 往往是更務實的選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved