即使程式完全未使用 try/throw/catch,啟用異常支援的編譯器仍需付出代價:
try 區塊邊界、catch 類型匹配表的資料結構與輔助代碼。典型數據:支援異常的建置比不支援的大 5%-10%、慢 5%-10% (視編譯器實作而定)。
理論上 C++ 標準要求編譯器支援異常,但主流編譯器 (MSVC, GCC, Clang) 皆提供關閉異常的編譯選項 (如 /EHsc-, -fno-exceptions)。適用場景:
風險: 若程式碼或庫實際拋出異常,行為未定義 (通常直接終止)。隨著標準庫與現代框架廣泛使用異常,此選項適用範圍逐年縮小。
throw(Type): 編譯器產生的檢查代碼與 try 幾乎同等開銷。不是免費的文檔!原則:僅在真正需要捕獲處的地方使用 try,避免濫用異常規格。
拋出異常比正常函數返回慢 3 個數量級 (約 1000 倍)。 涉及:堆疊展開、尋找匹配 catch、呼叫沿途解構函數、複製異常物件等複雜流程。
具體數字基於傳聞與早期基準測試,而非嚴謹大樣本統計。編廠鮮少公開詳細異常效能數據,實作差異極大。重點在定性認知,非定量依賴。
try 區塊與異常規格,僅在真正需處理處佈置。異常處理是強大的正確性工具,但非零成本。善用它的關鍵在於:只為錯誤付費,不為正常流程付費。