您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“C/C++中棧stack和堆heap有什么用”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“C/C++中棧stack和堆heap有什么用”這篇文章吧。
棧 (stack) 是為執(zhí)行線程流出的內(nèi)存空間. 堆 (head) 是為動態(tài)分配預留的空間.
我們以一段代碼來舉例:
#include <iostream> using namespace std; int a = 0; // 全局初始化區(qū) char *pt; // 全局未初始化 int main() { int b; // b在棧區(qū) char s[] = "abc"; // s在棧區(qū) char *p1; // 在棧區(qū) char *p2 = "123"; // "123"在常量區(qū), p3在棧區(qū) static int c = 0; // 全局靜態(tài)初始化區(qū) char *p3 = new char(65); // 在堆區(qū) char *p4 = new char[10]; // 在堆區(qū) return 0; }
棧區(qū): 棧區(qū)是分配局部變量的空間, 處于相對較高的地址. 棧地址向下增長
堆區(qū): 用于分配程序媛申請的內(nèi)存空間, 是向上增長的
靜態(tài)數(shù)據(jù)區(qū): 分配靜態(tài)變量, 全局變量的空間
只讀區(qū): 分配常量和程序代碼
棧: 棧上的空間是自動分配回收的. 生存周期只在函數(shù)的運行過程中, 運行后就釋放.
堆: 程序媛根據(jù)需要自己申請的空間, 只要程序媛不釋放空間, 就一直可以訪問到. 一旦忘記釋放會造成內(nèi)存泄漏.
棧: 只要棧的剩余空間大于所申請空間, 系統(tǒng)將為程序提供內(nèi)存, 否則將報異常提示棧溢出. 響應速度快.
堆: 系統(tǒng)收到程序的申請時, 會遍歷空閑內(nèi)存地址的鏈表. 尋找第一個空間大于所申請空間的堆節(jié)點. 響應速度慢.
棧: 由系統(tǒng)自動分配, 速度較快, 程序媛無法控制.
堆: 由 new 分配, 一般速度較慢, 而且容易產(chǎn)生內(nèi)存碎片, 不過用起來最方便.
棧: 在 Windows 下, 棧的大小是 2MB. 如果申請的空間超過棧的剩余空間時, 將提示overflow
(棧溢出).
堆: 堆的大小受限于計算機系統(tǒng)中有效的虛擬內(nèi)存. 堆獲得的空間比較靈活, 也比較大.
棧: 函數(shù)調(diào)用語句的下一條可執(zhí)行語句的地址, 函數(shù)的各個參數(shù), 函數(shù)中的局部變量.
堆: 具體內(nèi)容由程序媛, 我們安排.
注: 當有指針數(shù)據(jù)成員時, 必須用深復制, 使其使用堆區(qū)的空間.
以上是“C/C++中棧stack和堆heap有什么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。