2010-03-26 43 views
3

我讀思維在C++(第2卷):函數的靜態和動態的父

每當一個函數被調用,關於該函數 信息 在 激活推到運行時棧記錄實例(ARI),也叫 稱爲棧幀。一個典型的疊層 幀中包含(1) 調用函數的地址(以便執行可以 返回到它),(2)的指針的 函數的靜態父(該 範圍的ARI該詞法包含 稱爲函數,所以變量global 的函數可以被訪問)和 (3)一個指向函數的指針,它調用 它(它的動態父類)。該 邏輯上反覆 以下動態鏈接父結果路徑是 動態鏈,或撥打鏈

我無法理解是什麼意思筆者作爲函數的靜態和動態的父母。我也無法區分第1,2或3項。它們看起來都是一樣的。有人可以向我解釋這段話嗎?

+0

我只能看到一個調用者和一個被調用者。而且我知道,一旦被調用者返回,調用堆棧會被彈出一次(解除),這會導致幀指針減少並指向父函數(調用者)。 – legends2k 2010-03-26 12:33:36

回答

2

這一切對我來說聽起來都很奇怪。靜態幀指針通常用於具有詞彙範圍的語言中,如函數式語言,帶有嵌套函數的pascal族。 Globals在編譯時或運行時綁定一次,不應該需要幀指針。 (1)有效,但(2)在C++,AFAIK中不存在。

我懷疑(3)是爲了引用父框架指針。調用堆棧通常設置爲鏈接列表,以便調試器和相關工具可以在不需要深入瞭解該程序的情況下進行操作。

4

我認爲這個陳述不是關於C++,而是堆棧框架的一般結構。 1)主要功能是返回地址 - call後的指令地址。當執行返回時,將從棧中執行pop,並且執行將轉到該點(對於C++有效) 2)和3)對於允許嵌套函數的語言有效。 (函數內部聲明的函數)這樣的函數可以訪問父類的變量,因此它們具有鏈接(靜態鏈接)到父類的堆棧幀,並且動態鏈接是爲了能夠以遞歸方式調用它們自己。