內存堆與棧

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