2015-09-05 92 views
2

我對學習編程語言比較陌生,我覺得我對面向對象編程語言(更具體地說是C#語言)有20%至25%的理解。所以我真的在不知道其答案的實際意義的情況下對我的語言學習過程陳述這個問題,但我真的覺得我需要問這個問題。方法的代碼塊在執行時是否處於堆棧或堆中?

當一個方法被調用執行時,我知道它的所有局部變量及其參數和返回值實際上存在於堆棧內存中。雖然方法本身是從堆內存中作爲實例化對象或靜態類的成員,或作爲非靜態類的靜態成員調用的。

現在我的問題是,當方法被調用到堆棧中時,它是否只存在於堆棧中的變量和參數,還是它的所有代碼塊的整個方法將存在於在那一刻(執行)的堆棧?

該查詢已經從代碼塊的性質的一個實例化的方法(或靜態方法)內的類似的對比出現,而該方法被調用並且同時不會被調用它,相比的性質時一個非靜態類的成員,而類被實例化成一個對象,而不是。

現在,一個非靜態類的成員,被認爲像一個藍色打印,即它們在一個形式是非平易近人和非功能現有的(字段和方法不能被稱爲,和字段的值不能改變,方法不能改變值),但是這個藍圖相當實例化爲具有其成員的具體功能對象。

現在,如果堆中的實例化方法內的代碼塊只是一個藍圖,當調用該方法時實際上會在堆棧中「實例化」的藍圖在堆棧中執行任務,然後在任務完成時從堆棧中刪除。在這裏堆棧可以被看作是程序實際執行的地方,而另一方面,包括靜態類和對象以及堆本身的堆中的所有內容都將被視爲僅僅是數據和指令的存儲位置堆棧借用和利用,堆棧實際上執行我們整個程序的任務。

但是,如果堆棧內存實際上沒有包含正在執行的方法的代碼,並且堆棧只接收方法的局部變量和參數的臨時值,而堆中的方法本身同時從其堆位置執行編碼指令,只將值借給進程中的堆棧。在這裏,堆棧看起來就像是一個變量的值持有者,而對象和靜態類與他們的方法一起是程序本身在堆中的實際執行者,而具有代碼的實例化方法(或靜態類)是具體存在的並在堆中運作。

第三種可能性是,兩個存儲器(堆棧和堆)都不是實際的代碼執行位置,而是處理器本身的某處,數據的執行和更改正在發生,堆棧和堆棧僅僅是接受,保存和清理數據和指令方面的不同利用模式的存儲位置,就是這樣。

對於這麼長的問題,我很抱歉,我不知道如何幫助我作爲程序員獲得答案,但它真的讓我頭痛幾天,我找不到答案在爲初學者設計的文本中,所以我真的不知所措!

回答

4

方法不是實例化。類實例化,以創建對象。

對象由數據成員方法組成。只有數據成員動態地分配在進程內存中的某個地方。所有方法的代碼都靜態地位於稱爲「代碼段」的一段內存中。沒有任何方法的代碼被複制過。這是不需要的,因爲它是完全不變的。

堆棧與代碼無關。只有本地變量和參數存在於堆棧中。請注意,如果變量/參數的類型是引用,那麼只有引用(指針)的值位於堆棧上,但它指向的實際對象位於其他位置。

一篇文章介紹.NET的內存管理基礎知識can be found here

注意:這是一個有點簡化的觀點,但對於你的知識水平是準確的。

+0

這個問題被標記爲C#,這使事情變得複雜,因爲像C#和JavaScript這樣的語言可以在堆上運行時生成代碼。 –

+0

@ PeterTorr-MSFT當然。但是,OP還沒有開始考慮這些概念。 –

2

程序代碼位於程序的代碼區域。它既不堆也不堆棧。它在程序執行時由加載程序設置的內存區域中。

我建議你閱讀更多關於程序鏈接和加載。

+0

學習一些程序集也會有所幫助。獲取堆棧指針,指令指針以及查看跳轉的工作方式真的有助於繪製圖片。 –