1. 程式人生 > >Heap And Stack 堆與棧的區別

Heap And Stack 堆與棧的區別

交代一下背景,最近一直在看C++的相關知識,今天剛好看到“引用”這一部分。於是好奇心驅使,我想知道它與java的引用到底有什麼不同,於是開始搜尋大法,java的引用更加與c++的指標更加類似,但是也不一樣,當然這不是重點。然後搜尋的時候,突然又想知道在記憶體中的儲存情況,於是開始搜尋……,搜尋……。對於heap與stack的區別我又模糊了,於是到了今天的重點,順便記錄一下自己搜尋的成果。

堆和棧在什麼位置?

線上程中是如何與堆、棧進行互動?在多執行緒中,堆與棧又是怎麼樣一個機制?

答:在一個多執行緒併發的應用中,每個執行緒都有自己的棧。但是所有不同的執行緒共享一個堆,由於不同的執行緒共享一個堆,必然導致不同的執行緒之間存在協調關係,不同的執行緒在同一時間不會訪問相同的記憶體地址。

物件可以儲存在棧上嗎?

答:可以,一個物件可以被儲存在棧中,如果你在一個方法函式中沒有通過new關鍵字建立一個物件,那麼這個物件就會被存在棧中。示例程式碼(c++)如下:

void somefunction( )
{
/* create an object "m" of class Member
    this will be put on the stack since the 
    "new" keyword is not used, and we are 
   creating the object inside a function
*/

  Member m;

} //
the object "m" is destroyed once the function ends

一旦方法執行完畢,物件“m”就會從棧中移除。
再看一段程式碼


void somefunction( )
{
/* create an object "m" of class Member
    this will be put on the heap since the 
    "new" keyword is used, and we are 
   creating the object inside a function
*/

  Member* m = new Member( ) ;

  /* the
object "m" must be deleted otherwise a memory leak occurs */ delete m; }

以上物件是通過new 關鍵字建立的,因此這個物件存在記憶體堆中。在c++中需要我們手動移除,否則會造成記憶體洩漏

棧的大小可以增大嗎?堆的記憶體大小可以增大嗎?

答:棧的記憶體大小是一個固定值,不能增加(部分語言可以)。因此,如果棧的記憶體沒有足夠空間的時候,就會出現stack overflow,經常出現在很多巢狀方法使用的時候,或者是存在一個死迴圈。
而堆的記憶體可以通過系統機制調大,這是一點很重要的區別

堆與棧哪個速度更快?

棧的讀寫速度更快,因為分配記憶體的機制,只是移動指標,而堆還要做查詢等操作。

還有更加形象的圖,用於說明為啥棧比堆要快:同樣來源於上面的網址

這裡寫圖片描述

這裡寫圖片描述

一團亂糟糟的heap與整齊的stack,自然沒法比。

關於java的示例
這裡寫圖片描述

其他常見問題(持續更新)

  • 全域性變數也是放在棧裡嗎?
    答案:否,放在堆裡
  • 靜態變數、常量存放在哪裡?
    答案:還有一個記憶體區域叫做方法區

相關推薦

Heap And Stack 區別

交代一下背景,最近一直在看C++的相關知識,今天剛好看到“引用”這一部分。於是好奇心驅使,我想知道它與java的引用到底有什麼不同,於是開始搜尋大法,java的引用更加與c++的指標更加類似,但是也不一樣,當然這不是重點。然後搜尋的時候,突然又想知道在記憶

Heap Spray:的協同攻擊

包含 src 而不是 blog shell hit 存在 完整 font 1:應用場景 在針對瀏覽器的攻擊中,常常會結合使用堆和棧協同利用漏洞。 (1)當瀏覽器或其使用的ActiveX 控件中存在溢出漏洞時,攻擊者就可以生成一個特殊的HTML 文件來觸發這個漏洞。 (2)不

c++記憶體分配方式,區別

1)棧區(stack):由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。 2)堆區(heap):一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由OS回收。注意它與資料結構中的堆是兩回事,分配方式倒是類似於連結串列。 3)全域性/靜態區

C++:區別

C++中堆和棧的區別,自由儲存區、全域性/靜態儲存區和常量儲存區        文章來自一個論壇裡的回帖,哪個論壇記不得了!       在C++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態 儲存區和常量儲存區。       棧,就是那些由編譯器在需要

讓你徹底明白JAVA中區別

java程序 運行 一點 動態 自動變 key 空間 類型 lin 原文地址:http://www.2cto.com/kf/201302/190704.html 簡單的說: Java把內存劃分成兩種:一種是棧內存,一種是堆內存。 在函數中定義的一些基本類型的變量和對象的引用

c/c++的 資料結構的區別

一、預備知識—程式的記憶體分配 一個由c/C++編譯的程式佔用的記憶體分為以下幾個部分  1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。  2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計

區別(經典講解)

摘要:對於堆和棧,很多朋友都是不怎麼理解的,就算是開發了程式多年的朋友都會容易混淆。其實要區分它們並不難,但是怎樣使自己永久不會忘記哪得有技巧了。我相信,通過下面經典的講解,您一定不會再忘記堆和棧的區別了。 對於堆和棧,很多朋友都是不怎麼理解的,就算是開發了程式多年的朋友都會容易混淆。其實要區分它們並不難,

五大記憶體分割槽,區別

五大記憶體分割槽    在C++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。    棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數、函式引數等。    堆,就是那些由new分配的記

記憶體分為幾個部分?區別

五大記憶體分割槽     在C++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。     棧:就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數、函式引數等。     堆:就是那些由ne

區別

堆(Heap)與棧(Stack)是開發人員必須面對的兩個概念,在理解這兩個概念時,需要放到具體的場景下,因為不同場景下,堆與棧代表不同的含義。一般情況下,有兩層含義: (1)程式記憶體佈局場景下,堆與棧表示的是兩種記憶體管理方式; (2)資料結構場景下,堆與

Java中區別

1. 棧(stack)與堆(heap)都是Java用來在Ram中存放資料的地方。與C++不同,Java自動管理棧和堆,程式設計師不能直接地設定棧或堆。   2. 棧的優勢是,存取速度比堆要快,僅次於直接位於CPU中的暫存器。但缺點是,存在棧中的資料大小與生存期必須是確定的,缺乏靈活性。另外,棧資料可以共享,詳

Java中的基礎----的介紹、區別

堆和棧都是Java中常用的儲存結構,都是記憶體中存放資料的地方。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~我是可愛的分割線~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 堆:

C#

完成 time bool 語言 收集器 一段 兩個 介紹 在一起 解釋1、棧是編譯期間就分配好的內存空間,因此你的代碼中必須就棧的大小有明確的定義;堆是程序運行期間動態分配的內存空間,你可以根據程序的運行情況確定要分配的堆內存的大小 解釋2、 存放在棧中時要管存儲順序,

程序的段、

.data 初始化 申請 font har lin -h tom 才會 1.程序就是編譯出來的鏡像,處於執行狀態的程序叫進程.一個程序可以執行多次,每次執行會產生一個進程. 2. 程序鏡像裏有分成很多個段: 段其實就是在程序鏡像文件裏從一個位置到另一個位置範圍裏存放某種

java中資料的5種儲存位置()

任何語言所編寫的程式,其中的各型別的資料都需要一個儲存位置,Java中資料的儲存位置分為以下5種: 1.暫存器 最快的儲存區,位於處理器內部,但是數量極其有限。所以暫存器根據需求進行自動分配,無法直接人為控制。 2.棧記憶體 位於RAM當中,通過堆疊指標可以從處理器獲得直接支援。堆疊指標向下

區別 學習整理1

原文 有些地方還沒有完全理解收藏學習 堆和棧的區別一、預備知識—程式的記憶體分配一個由c/C++編譯的程式佔用的記憶體分為以下幾個部分1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2、堆區(heap)

佇列 區別

百度百科連結 佇列:https://baike.baidu.com/item/%E9%98%9F%E5%88%97/14580481?fr=aladdin 棧:https://baike.baidu.com/item/%E6%A0%88/12808149 棧 佇列&n

深入理解Javascript中的、淺拷貝深拷貝

Javascript中的淺拷貝與深拷貝 先從JavaScript的資料型別存放的位置堆疊開始說吧 什麼是堆疊? 我們知道計算機領域中堆疊是兩種資料結構,它們只能再一端(稱為棧頂(top))對資料項進行插入和刪除。 堆:佇列優先,先進先出,由作業系統自動分配釋放,存放函式的引數值,區域性變數的

java程式設計中的,你瞭解多少?

在JVM中記憶體有這5類 堆(Heap)存放關鍵字new建立的物件和陣列;java堆是jvm記憶體管理中最大的一塊,執行緒共享;當使用new建立物件時,不必指定分配空間的大小,jvm會動態自動分配一塊區域;在程式執行過程中,沒有指向此物件的引用時,此物件就被標記為可被回

C/C++:以及new簡單使用

C++中,記憶體分為5個區:堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。 名稱 特性 棧 由編譯器在需要時自動分配,不需要時自動清除的變數儲存區。通常存放區域性變數、函式引數等。