C++異常處理機制__3.編譯器何時生成棧回退代碼

 學習異常原理,先從幾個例子看起

編譯器什麼時候生成異常支持代碼(棧回退支持)



觀察每個函數生成的彙編代碼 (VS2005, Release模式)




可見函數1 沒有棧回退代碼。
雖然new 函數失敗時可能拋出異常,但編譯器判斷函數有異常時沒有局部類變量需要析構,
所以沒有棧回退代碼生成



可見函數2 加入了棧回退代碼。
因爲new 函數失敗時可能拋出異常,這時需要析構類變量s1,所以加入了棧回退



函數3 和 4 也同樣可以得到上面結論。



當函數拋出一個異常不會生成棧回退,因爲這裏沒有對象需要析構



當函數中有 try 語句時,不管有沒有對象需要析構,都會生成棧回退代碼  

總結:
編譯器會檢查函數中是否可能有異常發生,發生異常後是否需要完成棧回退(析構局部類變量),或函數中是否有 try 語句
通過判斷決定是否加入異常處理代碼。

發佈了59 篇原創文章 · 獲贊 9 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章