C/C++內存分爲五個部分:
一、棧區(stack):存放函數的參數值,局部變量的值等(編譯器自動分配釋放 )。
二、堆區(heap): 注意:與數據結構中的堆徹底不一樣,分配方式相似於鏈表(程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收 )。
三、全局區(靜態區):全局變量和靜態變量存儲在一塊,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另外一塊區域(程序結束後由系統釋放)。
四、文字常量區:常量字符串就是存儲在這裏(程序結束後由系統釋放)。
五、程序代碼區:存放函數體的二進制代碼。 程序員
在unix環境高級編程一書中,對於棧和堆是這樣定義的:編程
棧:自動變量以及每次函數調用是所需保存的信息都存放在此段中。每次調用函數時,其返回地址以及調用者的環境信息(例如某些機器寄存器的值)都存放在棧中。而後,最近被調用的函數在棧上爲其自動和臨時變量分配存儲空間。經過以這種方式使用棧,能夠遞歸調用c函數。遞歸函數每次調用自身時,就使用一個新的棧幀,所以一個函數調用實例中的變量集不會影響另外一個函數調用實例中的變量。數據結構
堆:一般在堆中進行動態存儲分配,因爲歷史上造成的慣例,堆位於非初始化數據段和棧之間。函數
棧和隊列頭文件:spa
#include <stack>unix
#include<queue>遞歸
棧:隊列
stack<int> curStack; //棧定義內存
操做:字符串
curStack.empty() 若是棧爲空返回true,不然返回false;
curStack.size() 返回棧內元素的大小;
curStack.pop() 從棧頂彈出一個成員;
curStack.push() 向棧內壓入一個成員;
curStack.top() 返回棧頂,但不刪除成員;
隊列:
queue<int> curQueue; //隊列定義
操做:
curQueue.empty() 若是隊列爲空返回true,不然返回false;
curQueue.size() 返回隊列內元素的大小;
curQueue.pop() 從隊列彈出一個成員;
curQueue.push() 向隊列壓入一個成員;
curQueue.front() 返回到隊首,但不刪除成員;
curQueue.back() 返回到隊尾,但不刪除成員;
堆、棧、隊列之間的區別是?
①堆是在程序運行時,而不是在程序編譯時,申請某個大小的內存空間。即動態分配內存,對其訪問和對通常內存的訪問沒有區別。
②棧就是一個桶,後放進去的先拿出來,它下面原本有的東西要等它出來以後才能出來。(後進先出)
③隊列只能在隊頭作刪除操做,在隊尾作插入操做.而棧只能在棧頂作插入和刪除操做。(先進先出)