堆和棧的區別

2022-01-25 08:33:36 字數 963 閱讀 6420

輸出的結果就是變數的記憶體位址。其中v1,v2,v3是本地變數,g1,g2,g3是全域性變數,s1,s2,s3是靜態變數。你可以看到這些變數在記憶體是連續分布的,但是本地變數和全域性變數分配的記憶體位址差了十萬八千里,而全域性變數和靜態變數分配的記憶體是連續的。這是因為本地變數和全域性/靜態變數是分配在不同型別的記憶體區域中的結果。對於乙個程序的記憶體空間而言,可以在邏輯上分成3個部份:**區,靜態資料區和動態資料區。動態資料區一般就是「堆疊」。「棧(stack)」和「堆(heap)」是兩種不同的動態資料區,棧是一種線性結構,堆是一種鏈式結構。程序的每個執行緒都有私有的「棧」,所以每個執行緒雖然**一樣,但本地變數的資料都是互不干擾。乙個堆疊可以通過「基位址」和「棧頂」位址來描述。全域性變數和靜態變數分配在靜態資料區,本地變數分配在動態資料區,即堆疊中。程式通過堆疊的基位址和偏移量來訪問本地變數。  

當程序初始化時,系統會自動為程序建立乙個預設堆,這個堆預設所佔記憶體的大小為1m。堆物件由系統進行管理,它在記憶體中以鏈式結構存在。通過下面的**可以通過堆動態申請記憶體空間:  

handle hheap=getprocessheap();  

murali krishnan 是 internet information server (iis) 組的首席軟體設計工程師。從 1.0 版本開始他就設計 iis,並成功發行了 1.0 版本到 4.0 版本。murali 組織並領導 iis 效能組三年 (1995-1998), 從一開始就影響 iis 效能。他擁有威斯康星州 madison 大學的 m.s.和印度 anna 大學的 b.s.。工作之外,他喜歡閱讀、打排球和家庭烹飪。  

上述改進已在 windows 2000 beta 2 和 windows nt 4.0 sp4 中使用。改進後,堆鎖的競爭率顯著降低。這使所有 win32 堆的直接使用者受益。crt 堆建立於 win32 堆的頂部,但它使用自己的小塊堆,因而不能從 windows nt 改進中受益。(visual c++ 版本 6.0 也有改進的堆分配程式。)  

// 使用嵌入  

堆和棧區別

一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它...

堆和棧區別

管理方式 棧由編譯器自動管理 堆由程式設計師控制,使用方便,但易產生記憶體洩露。生長方向 棧向低位址擴充套件 即 向下生長 是連續的記憶體區域 堆向高位址擴充套件 即 向上生長 是不連續的記憶體區域。這是由於系統用鍊錶來儲存空閒記憶體位址,自然不連續,而鍊錶從低位址向高位址遍歷。空間大小 棧頂位址和...

堆和棧區別

一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它...