C++運行棧與函數調用的執行

全局變量在目標代碼總都是用一個唯一確定的地址定位的,然而,對於局部變量卻不能如此,這是因爲如下原因:

  1. 局部變量只在調用他所在的函數時纔會生效,一旦函數返回後就會失效。很多局部變量的生存週期源小於整個程序的運行週期,如果爲每個局部變量分配不同的空間,則空間利用率會降低。
  2. 更重要的是,當發生遞歸調用時,會存在當一個函數尚未返回,對他的另一次調用又發生的情況,對於這種多次調用,相同名稱的局部變量會有不同的值,這些值必須同時保存在內存中,而且相互不影響,因此他們必然有不同的地址。想全局變量那樣分配唯一確定的地址肯定時行不通的。
  3. 函數形參的情形,與局部變量非常相似,他們都不能夠像全局變量那樣固定地址加以定位,而需要存儲在一種特殊的結構中,這就是棧

運行棧
  函數調用中的形參和局部變量,當調用開始時生效,當函數返回後即失效,他們的有效時間和函數調用的期間是重合的。這樣,對於一組嵌套的函數調用中的一次調用,其形參和局部變量生效的時間越早,失效的時間就越晚,這剛好滿足了“先進後出”的要求。這樣,很自然的,函數的形參和局部變量,可以用棧來存儲,這種棧叫做運行棧。
  運行棧實際上是一段區域的內存空間,與存儲全局變量的空間無異,只是尋址的方式不同而已。運行棧中的數據分爲一個一個棧幀,每個棧幀對應一次函數調用,棧幀中包括這次函數調用中的形參值,一些控制信息,局部變量和一些臨時數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章