2013-10-02 213 views
0

什麼時候放入堆棧的函數?內存分配,堆棧和堆棧

喜歡,當它們被編譯時,每個函數都放在堆棧上,然後當一個對象調用它時,它會轉到堆棧上的那個函數?

OR

第一主要功能是加載到堆,然後對象在堆, 分配,然後隨着對象調用它們被放入堆棧的功能,每次分配存儲器到本地變量上堆棧?

並做靜態方法也遵循相同的程序,就像正常的功能,因爲我聽說他們只分配一次內存。

所以幫我識別該程序的圖形表示的是正確的......

enter image description here

enter image description here

回答

3

函數是放在堆棧上。 call stack包含呼叫幀,當一個函數被調用時,一個新的呼叫幀被推送。它在函數返回時彈出。

的呼叫幀通常還含有一些引用或指針到[調用]功能的代碼(即一個返回地址)通常表示爲java bytecode

這是一個很常見的情況,但不是一種通用。參見舊A.Appel的編譯連續書(描述沒有任何堆棧的SML/NJ實現)。

+0

因此函數的定義存儲在某處,堆棧包含該空間的內存地址加上局部變量的內存? – user2837260

+0

我不明白你稱之爲函數的定義。在我看來,函數的定義是定義它的源代碼的一部分,當函數被調用時,源代碼不在內存中(除了一些同形語言,但不包括Java或C++) –

+0

年。 。函數的定義就是它的作用。就像添加兩個數字一樣。定義x + y的部分是定義。如果它沒有存儲在內存中(指令是),那麼函數調用什麼指向 ????? – user2837260

0

堆棧是在運行時構建的東西。如果一個方法(不管是否靜態)被調用,它的調用被放在堆棧上。如果方法結束,它將從堆棧中移除,以便調用者再次成爲第一個元素並繼續執行。

您可以使用調試器來觀察這一點。調試器向您顯示調用堆棧。如果你在你的main方法中設置了一個斷點並且進入了另一個方法調用,你會發現那個方法調用是main方法之上的堆棧中的頂層元素。

1

何時將函數放入堆棧?

堆棧包含數據而不是函數。爲函數預先分配空間是沒有意義的,因爲它可以遞歸調用,或根本不調用。

當它們被編譯,各功能已經在堆棧上,

你在哪裏讀的?

,然後當一對象調用它,

線程運行的代碼,而不是對象。

它轉到堆棧上的該功能?

沒有喜歡它。

第一主要功能是加載到堆,

功能未加載在棧上。

那麼對象在堆中分配,

可能,雖然他們可以在棧與逃逸分析上進行分配。

,然後作爲對象調用它們被放入堆棧的功能,

線程調用方法以及當方法被調用它可任選地分配一個堆棧幀。該堆棧幀可以包含局部變量和堆棧分配的對象。

每次分配內存到堆棧上的本地變量?

每個方法調用都可以爲所有使用內存的局部變量分配一個內存塊。注意:一些本地變量可以分配給寄存器,並且可能不使用堆棧。

,做靜態方法也遵循相同的程序,

有不同的非靜態方法靜態和非靜態方法之間沒有真正的區別會在啓動該實例的附加參數。

像正常的功能,因爲我聽說他們只分配一次內存。

方法每次調用只分配一次。假設你有一個帶有局部變量的循環,它仍然只能被分配一次。

+0

this和[this](http:// en。wikipedia.org/wiki/Call_stack)幫助了很多.. 所以我收集的是這樣的: 函數定義存儲在somwewhere.when函數調用時,它被分配堆棧幀(局部變量的空間和該定義的返回地址) 但我唯一不能得到的是如何爲堆棧上的局部變量分配的內存傳遞給定義以及什麼使靜態方法有任何不同 – user2837260