變量的內存空間主要有如下幾個:堆(heap)、棧(stack)、全局靜態區、文字常量區、代碼區程序員
heap:不連續的內存區域,由開發者自行進行開闢和釋放。若是程序結束時沒有進行釋放、操做系統會對其進行管理。開發者經過new/malloc等建立存放在heap上的變量,經過delete/free對他們進行刪除。數據結構
stack:和堆不一樣,它是連續的內存空間。由編譯器進行分配和回收等管理。通常存放函數的參數、局部變量等。函數
全局靜態區:存放全局變量和靜態變量。全局變量在main方法以前聲明,不顯示使用static關鍵字。做用域是整個工程。在定義的本文件內直接使用。而其餘的文件加上extern關鍵字聲明後,也可使用。靜態變量由static關鍵字聲明,他的做用域只在定義的文件,外部的文件不能用extern的方式進行使用。也就是說全局變量必定是靜態變量,而靜態變量不必定是全局的。anyway,這兩個變量都存儲在全局靜態區。操作系統
文字常量區:存放常量,像const聲明的變量、或者字符串常量就存儲在這個內存空間中。隊列
代碼區:也叫代碼段,存放程序的二進制代碼。內存
系統響應:資源
對於堆,應知道系統有一個記錄空閒內存地址的鏈表,當系統收到程序申請時,遍歷該鏈表,尋找第一個空間大於申請空間的堆結點,刪除空閒結點鏈表中的該結點,並將該結點空間分配給程序(大多數系統會在這塊內存空間首地址記錄本次分配的大小,這樣delete才能正確釋放本內存空間,另外系統會將多餘的部分從新放入空閒鏈表中)。作用域
對於棧,只要棧的剩餘空間大於所申請空間,系統爲程序提供內存,不然報異常提示棧溢出。開發
碎片問題:字符串
對於堆,頻繁的new/delete會形成大量碎片,使程序效率下降。
對於棧,它是一個先進後出的隊列,進出一一對應,不會產生碎片。
生長方向:(這決定了棧在高地址區、堆在底地址區)
堆向上,向高地址方向增加。
棧向下,向低地址方向增加。
分配方式:
堆都是動態分配(沒有靜態分配的堆)。
棧有靜態分配和動態分配,靜態分配由編譯器完成(如局部變量分配),動態分配由calloc函數分配,但棧的動態分配的資源由編譯器進行釋放,無需程序員實現。
分配效率:
堆由C/C++函數庫提供,機制很複雜。因此堆的效率比棧低不少。
棧是極其系統提供的數據結構,計算機在底層對棧提供支持,分配專門寄存器存放棧地址,棧操做有專門指令。