2013年1月20日 星期日

setjmp、longjmp以及C++ exception

之前略讀的一些linux driver以及linux kernel的書籍,對於底層稍微有一點點的了解,現在回頭過來看richard stevens的大作advanced programming the unix envrionment,真的又是別有一番風味阿~很多細節慢慢在心裡一一浮現

在其中提到了setjmp以及longjmp,為了克服goto不該使用,而且goto無法跳躍function call,其實主要原因應該是卡在stack frame的部分,在組合語言中,基本上程式可以跳到任意位置,但是stack frame是各家程式引入的機制,不遵循恐怕會有一些副作用,所以引入setjmp以及longjmp,此外書本中也提到了global variable以及register的狀態必須要注意,setjmp以及longjmp並無法回復他們的狀態,但其實還有更嚴重的是~~這個機制掠過了所有該free或者delete的空間@@a,這點書中就沒有提到了

跟著C++引入了exception,讓大家可以很歡樂的使用try~catch跟throw exception來處理這件事情又可以避開setjmp/longjmp的問題,C++是怎樣做到的,其實他偷偷在stack frame上面塞入了一個link list結構,每個list node又配置了一個exception handler,用來處理結束該stack frame之後該處理的事情

C++塞入了這些結構,表示programmer跟program在執行的時候必須要付出一些額外的代價,但是總比setjmp跟longjmp來的好

話說回來,不知道哪裡看來的一句話,一直縈繞在我的心頭:programmer不應該把例外處理當成程式流程的一部份。我一直無法參悟這句話,是說例外處理就是例外,不應該把例外處理當成程式流程中的一個處理過程?但是例為處理本身就程式的一環(?)難道寫成是不應該考慮例外嗎?還是例外就是意料之外,所以例外處理本身該做的就只有收拾善後跟列印錯誤??

沒有留言:

張貼留言