- 數據結構
- 程序一般放在Rom(只讀內存)中,運行時拷貝到內存RAM(隨機存儲器)
- 棧區:相對較高的地址,棧地址向下增長
- 堆區:向上增加,給程序員分配的內存空間
- 申請方式和回收方式
- 棧:系統自動分配空間,函數運行的過程中,之後會被釋放掉。
- 堆:程序員自己申請的空間,malloc。堆上的空間只要程序員不釋放,就一直可以訪問到。但是忘記釋放,就會造成內存泄漏。
- 申請後系統響應
- 棧:棧的剩餘空間不足,報異常棧溢出
- 堆:操作系統有記錄空閒內存地址的鏈表,會找第一個空間大於申請空間的堆節點,然後把該節點刪除,空間分給程序,代碼的delete會釋放空間。沒有用掉的系統的空間會繼續重新放入空閒鏈表。
- 申請效率
- 棧:比較快,系統分配
- 堆:new出來的,容易產生內存碎片
- 申請大小的限制
- 棧:windows系統棧是向低地址擴展,連續的內存區域,棧頂的地址和最大容量系統預先設置好了。windows下,棧的大小是2M(編譯的時候可以設置);申請的空間超過棧的剩餘空間,提示overflow。
- 堆:向高地址擴展,不連續的內存區域(指針實現),鏈表遍歷是從低地址到高地址。堆的大小受限於計算機系統中有效的虛擬內存。
- 存儲的內容
- 棧:主函數中函數調用後的下一條指令的地址,然後是函數的各個參數。大部分C編譯器,參數從右到左邊,函數中的局部變量入棧,靜態變量不入棧~
- 堆:頭部用一個字節放堆的大小
- 存取效率
char s1[] = "aa";
char *s2 = "bb";
- s1是運行時賦值(棧上的數組比指針指向的字符串存取快)
- s2是編譯時確定,堆