C++不常用關(guān)鍵字(
本文關(guān)鍵詞:leave,由筆耕文化傳播整理發(fā)布。
總結(jié)__finally塊被執(zhí)行的流程時(shí),無外乎三種情況。第一種就是順序執(zhí)行到__finally塊區(qū)域內(nèi)的代碼,這種情況很簡單,容易理解;第二種就是goto語句或return語句引發(fā)的程序控制流離開當(dāng)前__try塊作用域時(shí),系統(tǒng)自動(dòng)完成對(duì)__finally塊代碼的調(diào)用;第三種就是由于在__try塊中出現(xiàn)異常時(shí),導(dǎo)致程序控制流離開當(dāng)前__try塊作用域,這種情況下也是由系統(tǒng)自動(dòng)完成對(duì)__finally塊的調(diào)用。無論是第
2種,還是第3種情況,毫無疑問,它們都會(huì)引起很大的系統(tǒng)開銷,編譯器在編譯此類程序代碼時(shí),它會(huì)為這兩種情況準(zhǔn)備很多的額外代碼。一般第2種情況,被稱為“局部展開(LocalUnwinding)”;第3種情況,被稱為“全局展開(GlobalUnwinding)”。在后面闡述SEH實(shí)現(xiàn)的時(shí)候會(huì)詳細(xì)分析到這一點(diǎn)。
第3種情況,,也即由于出現(xiàn)異常而導(dǎo)致的“全局展開”,對(duì)于程序員而言,這也許是無法避免的,因?yàn)槟阍诶卯惓L幚頇C(jī)制提高程序可靠健壯性的同時(shí),不可避免的會(huì)引起性能上其它的一些開銷。呵呵!這世界其實(shí)也算瞞公平的,有得必有失。
但是,對(duì)于第2種情況,程序員完全可以有效地避免它,避免“局部展開”引起的不必要的額外開銷。實(shí)際這也是與結(jié)構(gòu)化程序設(shè)計(jì)思想相一致的,也即一個(gè)程序模塊應(yīng)該只有一個(gè)入口和一個(gè)出口,程序模塊內(nèi)盡量避免使用goto語句等。但是,話雖如此,有時(shí)為了提高程序的可讀性,程序員在編寫代碼時(shí),有時(shí)可能不得不采用一些與結(jié)構(gòu)化程序設(shè)計(jì)思想相悖的做法,例如,在一個(gè)函數(shù)中,可能有多處的return語句。針對(duì)這種情況,SEH提供了一種非常有效的折衷方案,那就是__leave關(guān)鍵字所起的作用,它既具有像goto語句和return語句那樣類似的作用(由于檢測到某個(gè)程序運(yùn)行中的錯(cuò)誤,需要馬上離開當(dāng)前的
__try塊作用域),但是又避免了“局部展開” 的額外開銷。還是看個(gè)例子吧!代碼如下:
本文關(guān)鍵詞:leave,由筆耕文化傳播整理發(fā)布。
本文編號(hào):331579
本文鏈接:http://sikaile.net/wenshubaike/xkhy/331579.html