C++執行棧與函式呼叫的執行
阿新 • • 發佈:2019-01-05
全域性變數在目的碼總都是用一個唯一確定的地址定位的,然而,對於區域性變數卻不能如此,這是因為如下原因:
- 區域性變數只在呼叫他所在的函式時才會生效,一旦函式返回後就會失效。很多區域性變數的生存週期源小於整個程式的執行週期,如果為每個區域性變數分配不同的空間,則空間利用率會降低。
- 更重要的是,當發生遞迴呼叫時,會存在當一個函式尚未返回,對他的另一次呼叫又發生的情況,對於這種多次呼叫,相同名稱的區域性變數會有不同的值,這些值必須同時儲存在記憶體中,而且相互不影響,因此他們必然有不同的地址。想全域性變數那樣分配唯一確定的地址肯定時行不通的。
- 函式形參的情形,與區域性變數非常相似,他們都不能夠像全域性變數那樣固定地址加以定位,而需要儲存在一種特殊的結構中,這就是棧
執行棧
函式呼叫中的形參和區域性變數,當呼叫開始時生效,當函式返回後即失效,他們的有效時間和函式呼叫的期間是重合的。這樣,對於一組巢狀的函式呼叫中的一次呼叫,其形參和區域性變數生效的時間越早,失效的時間就越晚,這剛好滿足了“先進後出”的要求。這樣,很自然的,函式的形參和區域性變數,可以用棧來儲存,這種棧叫做執行棧。
執行棧實際上是一段區域的記憶體空間,與儲存全域性變數的空間無異,只是定址的方式不同而已。執行棧中的資料分為一個一個棧幀,每個棧幀對應一次函式呼叫,棧幀中包括這次函式呼叫中的形參值,一些控制資訊,區域性變數和一些臨時資料。