C++學習--------------棧記憶體和堆記憶體的區別
阿新 • • 發佈:2018-10-31
- 資料結構中的堆與棧:
棧:是一種連續儲存的資料結構,具有先進後出的性質。通常的操作有入棧(圧棧)、出棧和棧頂元素。想要讀取棧中的某個元素,就要將其之前的所有元素出棧才能完成。類比現實中的箱子一樣。
堆:是一種非連續的樹形儲存資料結構,每個節點有一個值,整棵樹是經過排序的。特點是根結點的值最小(或最大),且根結點的兩個子樹也是一個堆。常用來實現優先佇列,存取隨意。
- 記憶體中的棧區與堆區:
一般說到記憶體,指的是計算機的隨機儲存器(RAM),程式都在這裡面執行。計算機記憶體的大致劃分如下圖所示:
棧記憶體:由程式自動向作業系統申請分配以及回收,速度快,使用方便,但程式設計師無法控制。若分配失敗,則提示棧溢位錯誤。注意,const區域性變數也儲存在棧區內,棧區向地址減小的方向增長。
//測試棧記憶體
#include <iostream>
int main()
{
int i = 10; //變數i儲存在棧區中
const int i2 = 20;
int i3 = 30;
std::cout << &i << " " << &i2 << " " << &i3 << std::endl;
return 0;
}
測試輸出為:
&i3 < &i2 < &i,證明地址是減小的。
堆記憶體
//測試堆記憶體和棧記憶體的區別 #include <iostream> int main() { int i = 10; //變數i儲存在棧區中 char pc[] = "hello!"; //儲存在棧區 const double cd = 99.2; //儲存在棧區 static long si = 99; //si儲存在可讀寫區,專門用來儲存全域性變數和靜態變數的記憶體 int* pi = new int(100); //指標pi指向的記憶體是在 堆區,專門儲存程式執行時分配的記憶體 std::cout << &i << " " << &pc << " " << &cd << " " << &si << " " << pi << std::endl; delete pi; //需程式設計師自己釋放 return 0; }
測試輸出為:
執行多次後會發現pi所指向的地址並不連續,是跳躍式的;而&si是一致的,儲存在可讀寫區;前三個變數都儲存在棧區,由程式自動分配和銷燬。
- 關於堆和棧區別的比喻:
堆和棧的區別可以引用一位前輩的比喻來看出:
使用棧就象我們去飯館裡吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。
https://www.cnblogs.com/ChenZhongzhou/p/5685537.html