VC++ 提供三種異常處理模式:
/EHsc,僅捕獲 C++ throw)/EHa,捕獲 C++ 與 Windows 結構化異常)每增加一級皆付出時空代價。以簡單類別 MyAppObject 測試:
| 模式 | Exe | Obj |
|---|---|---|
| 無異常處理 | 32,256 bytes | 20,931 bytes |
| C++ only (/EHsc) | 37,888 bytes | 24,959 bytes |
| C++ with SEH (/EHa) | 37,888 bytes | 28,486 bytes |
啟用 C++ 異常處理後程式碼體積增長近 20%。
編譯器必須保證異常拋出時自動變數正確銷毀。以 TestMyAppObject 為例:
before try、in tryline2~line6 每行皆為熱點邏輯:發生異常 → 根據熱點執行堆疊回滾(銷毀已建構物件) → 尋找 catch → 若無則繼續向上層傳播。
VC++ 實作為靜態 jump 列表 + stack_unwind() 函數,依當前熱點動態跳轉至回滾碼。這導致每個可能拋出異常的函數增加跳轉表,工作集顯著增大。
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++ 重要語言構造,為可靠應用奠基,但具時空代價。應僅在「異常時」使用,勿作控制結構;能減少熱點則減少。