1ios 2程序員 3算法 4數據結構 5函數 6spa 7操作系統 8指針 9code 10對象 11 12 13 14 15 16 17 18 19 |
#include <iostream> using namespace std; class A { private : int n; public : A( int m):n(m) { } ~A(){} }; int main() { A a(1); //棧中分配 A b = A(1); //棧中分配 A* c = new A(1); //堆中分配 delete c; return 0; } |
第一種和第二種沒什麼區別,一個隱式調用,一個顯式調用,二者都是在進程虛擬地址空間中的棧中分配內存,而第三種使用了new,在堆中分配了內存,而棧中內存的分配和釋放是由系統管理,而堆中內存的分配和釋放必須由程序員手動釋放。採用第三種方式時,必須注意一下幾點問題:
- new建立類對象須要指針接收,一處初始化,多處使用
- new建立類對象使用完需delete銷燬
- new建立對象直接使用堆空間,而局部不用new定義類對象則使用棧空間
- new對象指針用途普遍,好比做爲函數返回值、函數參數等
- 頻繁調用場合並不適合new,就像new申請和釋放內存同樣
- 棧的大小遠小於堆的大
- 棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率 比較高。堆則是C/C++函數庫提供的,它的機制是很複雜的,例如爲了分配一塊內存,庫函數會按照必定的算法(具體的算法能夠參考數據結構/操做系統)在 堆內存中搜索可用的足夠大小的空間,若是沒有足夠大小的空間(多是因爲內存碎片太多),就有可能調用系統功能去增長程序數據段的內存空間,這樣就有機會 分 到足夠大小的內存,而後進行返回。顯然,堆的效率比棧要低得多