當時講師前半段一直在講 SEH ,和 C++ 關系不大。我本以為會講 C++ 異常的實現的,我個人以前研究過一些,很有興趣聽聽人家的理解,結果沒有聽到。據說後來那個會場最終吵了起來,很遺憾沒有領略那個盛況 :)
鮑同學提到 VC6 的實現問題,我可以證明,VC6 的異常處理,在 happy path 上是沒有什麼內核 API 調用的。
VC6 的異常處理也不比 icc gcc 什麼的差。是不是好點我就說不准了。
unhappy path 的性能我個人不是很關心。我想大家也不會太關心吧。
不過,VC6 上關掉異常是可以提高性能的。因為畢竟有些環境需要設置,VC6 會利用 fs 保存一些環境信息。而且無論是什麼編譯器實現,因為需要處理 unhappy path 一般需要編譯自動生成大量的代碼。這比你只用返回值一定會生成更多更長的字節數。只是因為大家現在都不大關心代碼體積,這個問題被掩蓋了。我個人在某些情況下是在乎這個的。而且代碼體積增加也意味著略微的時間效率損失,ICC 或許會優化的好一些,讓其在 happy path 上,對性能影響最小,比如調遠 unhappy path 的 code 的物理距離等。
除零的問題是這樣,一般非數學計算的程序,我們很少用除法,即使用到,大多數情況,程序邏輯可以保證其不為0。而數學計算的程序一般又用的浮點數,除零得到的是無窮大並不拋出異常。所以我並不認為用除0異常來體現異常的優越性有特別大的說服力。
我個人因為特定的項目環境的原因,是不使用異常機制的。大部分情況下,處理 unhappy path 用 goto 足亦。這裡就扯到 goto 的問題。goto 在很多人看來很不恥。不過我認為在函數設置一些出口點,然後 goto 是一種很優美的方法。
其實不用異常的好處也很多,首先程序的復雜性降低了,否則程序的流程會比較復雜,對程序員的要求更高。其次,接口的設計也會比較簡單,最後性能會有那麼一點的提高。而且,我的程序曾經大量使用 coroutine,C++ 異常對此很難支持。呵呵,言多必失,我對異常幾乎沒怎麼用,都是理論知識,不敢多評論了。
其實偶還是支持鮑同學大部分觀點的 :)