【C++內存管理之一】內存結構簡介

一、內存結構簡介

C++的內存結構,主要分爲五個區域:
棧區、堆區、全局區(靜態區)、常量區、代碼區。
擴展鏈接
堆棧大小設置

1、內存分配方式

1、棧

1、由編譯器和操作系統管理;
2、函數執行開始時,函數內的局部變量存儲在棧中;函數執行結束時,這些存儲單元自動被釋放;
3、執行效率很高,但是分配的內存容量有限【棧內存分配運算內置於處理器的指令集中】。

2、堆

1、由用戶程序管理;
2、用戶手動分配的存儲空間。比如由 new分配的內存塊,再由delete釋放;如果沒有delete,
程序結束後由系統自動回收,但容易造成內存泄漏

內存泄漏

3、自由存儲去

1、管理機制和堆類似;
2、區別就是由malloc分配內存,由free來釋放。

4、全局區(靜態區)

全局變量和靜態變量被分配到同一塊內存中,在以前的C語言中,全局變量又分爲初始化的和未初始化的,
在C++裏面沒有這個區分了,他們共同佔用同一塊內存區。

5、常量區

這是一塊比較特殊的存儲區,他們裏面存放的是常量,不允許修改。

2、堆棧的區別

1、舉個栗子

void fun(){
	int* p = new int[5];
	}

指針p存儲在棧中,new()分配了一段堆空間。即棧中存儲了一個p指針,指向一塊堆內存空間。

2、區別

1、管理方式:棧由編譯器自動管理;堆由用戶控制,容易產生內存泄漏。
2、空間大小:棧的默認空間大小是1M,可以設置。堆內存在32位系統中可以達到4G,即堆空間很大。
3、碎片問題:頻繁的new/delete會造成內存空間不連續,產生大量碎片,使程序效率降低。棧不會產生碎片,因爲先進先進後出的隊列。
4、生長方向:棧的生長方向是向上,即內存地址增加的方向;堆的生長方向是向下,即內存地址的減小的方向。
5、分配方式:棧有靜態分配和動態分配兩種方式:靜態分配是編譯器自動跟配,比如局部變量;動態分配由alloca函數進行分配。棧分配的空間都由編譯器釋放
6、分配效率:
棧的效率很高:棧是機器系統提供的數據結構,計算機底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧和出棧都有專門的指令集。
堆的效率很低:堆則是C/C++函數庫提供的,它的機制是很複雜的,例如爲了分配一塊內存,庫函數會按照一定的算法(具體的算法可以參考數據結構/操作系統)在堆內存中搜索可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由於內存碎片太多),就有可能調用系統功能去增加程序數據段的內存空間,這樣就有機會分到足夠大小的內存,然後進行返回。顯然,堆的效率比棧要低得多。
【注意】無論堆棧都要防止產生越界,因爲越界的結果很嚴重,要麼程序崩潰,要麼程序的堆棧結構被破壞,產生意想不到的結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章