C++中的棧內存和堆內存的區別

  • 數據結構中的堆與棧:

棧:是一種連續儲存的數據結構,具備先進後出的性質。一般的操做有入棧(圧棧)、出棧和棧頂元素。想要讀取棧中的某個元素,就要將其以前的全部元素出棧才能完成。類比現實中的箱子同樣。ios

堆:是一種非連續的樹形儲存數據結構,每一個節點有一個值,整棵樹是通過排序的。特色是根結點的值最小(或最大),且根結點的兩個子樹也是一個堆。經常使用來實現優先隊列,存取隨意。程序員

  • 內存中的區與區:

通常說到內存,指的是計算機的隨機儲存器(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;
}

測試輸出爲:spa

&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;
}

測試輸出爲:blog

運行屢次後會發現pi所指向的地址並不連續,是跳躍式的;而&si是一致的,儲存在可讀寫區;前三個變量都儲存在棧區,由程序自動分配和銷燬。排序

 

  • 關於堆和棧區別的比喻:

堆和棧的區別能夠引用一位前輩的比喻來看出:隊列

使用棧就象咱們去飯館裏吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,沒必要理會切菜、洗菜等準備工做和洗碗、刷鍋等掃尾工做,他的好處是快捷,可是自由度小。

使用堆就象是本身動手作喜歡吃的菜餚,比較麻煩,可是比較符合本身的口味,並且自由度大。

相關文章
相關標籤/搜索