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

淺談 C++ 異常處理的語義與效能代價

     編輯:C++ 入門

淺談 C++ 異常處理的語義與效能

VC++ 提供三種異常處理模式:

  1. No exception handling(無異常處理)
  2. C++ only(/EHsc,僅捕獲 C++ throw)
  3. C++ with SEH(/EHa,捕獲 C++ 與 Windows 結構化異常)

每增加一級皆付出時空代價。以簡單類別 MyAppObject 測試:

程式碼大小對比

模式ExeObj
無異常處理32,256 bytes20,931 bytes
C++ only (/EHsc)37,888 bytes24,959 bytes
C++ with SEH (/EHa)37,888 bytes28,486 bytes

啟用 C++ 異常處理後程式碼體積增長近 20%。

異常處理語義:Stack Unwinding

編譯器必須保證異常拋出時自動變數正確銷毀。以 TestMyAppObject 為例:

  • 區域:before try、in try
  • 熱點:line2~line6 每行皆為熱點

邏輯:發生異常 → 根據熱點執行堆疊回滾(銷毀已建構物件) → 尋找 catch → 若無則繼續向上層傳播。

VC++ 實作為靜態 jump 列表 + stack_unwind() 函數,依當前熱點動態跳轉至回滾碼。這導致每個可能拋出異常的函數增加跳轉表,工作集顯著增大。

效能測試結果

  • 無異常 / 不拋出異常:執行速度影響可忽略(僅維護熱點位置)
  • 拋出 C++ 異常:速度下降 ~20%
  • SEH 異常(除零):速度接近無異常,但跨函數 try-catch 會線性增加回滾代價,實際應用中異常發生時 10%-15% 下降屬正常

優化建議

將自動變數集中宣告於函數頂端,減少熱點數量:

// 僅 1 個熱點
X a, b;
Y c, d;

// 至少 3 個熱點
X a;
// do something (1)
X b;
// do something else (2)
Y c;
// do yet something else (3)
Y d;

總結

異常處理是 C++ 重要語言構造,為可靠應用奠基,但具時空代價。應僅在「異常時」使用,勿作控制結構;能減少熱點則減少。

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