這個問題是創建一個跟進我剛纔的問題的棧是由編譯器或OS /建築
我想知道堆棧是否由編譯器或OS /建築風格?另外操作系統如何知道這些編譯器的具體事情?例如:C++允許變量在堆棧和堆上創建數據,而Java只允許堆。
此外,如果在後文中提到的堆棧被創建,系統如何知道它,因爲系統只知道堆棧指針和基址指針。
這個問題是創建一個跟進我剛纔的問題的棧是由編譯器或OS /建築
我想知道堆棧是否由編譯器或OS /建築風格?另外操作系統如何知道這些編譯器的具體事情?例如:C++允許變量在堆棧和堆上創建數據,而Java只允許堆。
此外,如果在後文中提到的堆棧被創建,系統如何知道它,因爲系統只知道堆棧指針和基址指針。
堆棧是操作系統爲您的程序分配的內存位置。一旦分配完畢,操作系統會將一個寄存器(在x86上,它是esp
)設置到堆棧的位置,然後啓動程序。編譯器知道如果他們使用這個寄存器中的值作爲堆棧指針,他們會沒事的。然後他們做任何他們想做的事情。操作系統只是分配一個區域。它並不關心它如何被使用。
操作系統不知道你的程序將主要使用堆棧還是堆。但是,由於大多數編程語言都以某種方式使用堆棧,因此它知道應該分配一個堆棧。例如,Java將其對象存儲在堆上,但JVM的大多數實現將使用堆棧來維護調用幀(以及原始局部變量),因此它也需要堆棧。
的意思,它應該讀**一個棧**,因爲我們對每個正在運行的線程都有一個jvm棧。 – 2010-08-31 06:02:34
在可執行文件頭中,mainthreads stacksize通常有一個字段(字段由編譯器設置,通常可以使用鏈接器選項進行設置)。另外,在創建堆棧時,通常可以設置線程堆棧大小。 – 2010-08-31 06:34:10
JVM線程堆棧可能與實際的java程序相同或不同。討論起來很複雜,但是JVM可以爲它的系統堆棧中的每個Java線程保留一個單獨的堆棧,它用於本地代碼。 – nategoose 2010-08-31 19:02:54
傳統上,棧是放置機器代碼調用的返回地址的位置(所以它可以在完成時返回)。因此有指示可以在內存中輕鬆訪問這個位置。
很快發現將參數與返回地址一起調用是一種非常簡單而有效的方法。這隨後發展到處理本地地址等。
爲虛擬機中的每個線程創建一個Java虛擬機堆棧。該堆棧存儲幀,除了幀的推送和彈出操作之外,不能直接操作內容。
每次調用消息時會創建幀,並且使用來存儲數據和部分結果,以及執行動態鏈接,返回方法的值以及調度異常。
語言規範的詳細信息,即一個Java虛擬機堆棧類似於傳統語言堆棧,如C。所以對我來說,顯然jvm堆棧模型已經在jvm實現中被編碼和使用了,而不是由主機操作系統提供。
可能重複[什麼和堆棧和堆在哪裏](http:// stackoverflow。問題/ 79923 /什麼和哪裏是堆棧和堆) – 2010-08-31 05:16:10
我從Java的角度看不出兩個問題是如何連接的。您確實意識到JVM在Java世界中有效地執行平臺/體系結構,對嗎? – 2010-08-31 05:18:11
@Byron這只是我上一個問題的後續。另外問題不在於瞭解堆棧。從我以前的文章中,我曾經說過可以在堆上創建堆棧以防止緩衝區溢出等問題。所以如果在堆上創建,系統怎麼知道這個? – brett 2010-08-31 05:18:13