概述
棧 (stack) 是為執行線程流出的內存空間. 堆 (head) 是為動態分配預留的空間.
程序運行中的棧和堆
我們以一段代碼來舉例:
#include <iostream> using namespace std; int a = 0; // 全局初始化區 char *pt; // 全局未初始化 int main() { int b; // b在棧區 char s[] = "abc"; // s在棧區 char *p1; // 在棧區 char *p2 = "123"; // "123"在常量區, p3在棧區 static int c = 0; // 全局靜態初始化區 char *p3 = new char(65); // 在堆區 char *p4 = new char[10]; // 在堆區 return 0; }
- 棧區: 棧區是分配局部變量的空間, 處于相對較高的地址. 棧地址向下增長
- 堆區: 用于分配程序媛申請的內存空間, 是向上增長的
- 靜態數據區: 分配靜態變量, 全局變量的空間
- 只讀區: 分配常量和程序代碼
堆和棧的差異
申請方式和回收方式
棧: 棧上的空間是自動分配回收的. 生存周期只在函數的運行過程中, 運行后就釋放.
堆: 程序媛根據需要自己申請的空間, 只要程序媛不釋放空間, 就一直可以訪問到. 一旦忘記釋放會造成內存泄漏.
申請后系統的響應
棧: 只要棧的剩余空間大于所申請空間, 系統將為程序提供內存, 否則將報異常提示棧溢出. 響應速度快.
堆: 系統收到程序的申請時, 會遍歷空閑內存地址的鏈表. 尋找第一個空間大于所申請空間的堆節點. 響應速度慢.
申請效率比較
棧: 由系統自動分配, 速度較快, 程序媛無法控制.
堆: 由 new 分配, 一般速度較慢, 而且容易產生內存碎片, 不過用起來最方便.
申請大小的限制
棧: 在 Windows 下, 棧的大小是 2MB. 如果申請的空間超過棧的剩余空間時, 將提示overflow
(棧溢出).
堆: 堆的大小受限于計算機系統中有效的虛擬內存. 堆獲得的空間比較靈活, 也比較大.
堆和棧中的存儲內容
棧: 函數調用語句的下一條可執行語句的地址, 函數的各個參數, 函數中的局部變量.
堆: 具體內容由程序媛, 我們安排.
注: 當有指針數據成員時, 必須用深復制, 使其使用堆區的空間.
到此這篇關于C/C++中棧(stack)&堆(heap)詳解及其作用介紹的文章就介紹到這了,更多相關C++棧(stack)&堆(heap)內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/weixin_46274168/article/details/117205280