2 回答

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個(gè)贊
具體函數(shù)聲明及其實(shí)現(xiàn)可以用記事本或IDE打開(kāi)stack文件查看代碼。(VS2008中可以直接在#include上右擊文件名選擇打開(kāi)文檔。)
stack<T>是模板棧類型,其中棧的節(jié)點(diǎn)類型為T。
例如定義
struct BTreeNode
{
BTreeNode data;
BTreeNode *next;
};
那么stack<BTreeNode*>st;就定義了一個(gè)棧st,其中每個(gè)節(jié)點(diǎn)的類型為BTreeNode*。
看樣子st是用來(lái)存放樹(shù)的節(jié)點(diǎn)指針的一個(gè)棧,作為實(shí)現(xiàn)某些算法的數(shù)據(jù)結(jié)構(gòu)。
----

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊
1.棧是存放函數(shù)返回地址、參數(shù)、局部變量的。
堆是程序可以自由操作的內(nèi)存,使用時(shí)先申請(qǐng),用完之后釋放,如何使用完全由程序代碼控制。
2.棧在匯編代碼中表示成PUSH POP,用的是ESS段,SP寄存器
而堆不是,是在內(nèi)存中讀寫(xiě),EDS段,
3.
C++包括兩種被應(yīng)用程序管理的內(nèi)存區(qū)域:一種稱為棧(stack),另一種稱為堆(heap)。
stack是函數(shù)被調(diào)用時(shí)自動(dòng)分配的一塊內(nèi)存區(qū)域,它主要用于保留函數(shù)內(nèi)使用的變量及函數(shù)調(diào)用位置處下一條代碼的地址。
stack是后進(jìn)先出,一個(gè)可變的指針指向stack的頂部。
本質(zhì)上,當(dāng)一個(gè)函數(shù)被程序調(diào)用時(shí),當(dāng)前的執(zhí)行地址被放入stack,如果有參數(shù)傳遞到函數(shù)內(nèi),這些參數(shù)也被壓入stack,如果函數(shù)內(nèi)有變量,它們也被壓入stack,如果函數(shù)執(zhí)行時(shí)調(diào)用另一個(gè)函數(shù),重復(fù)上面的過(guò)程。
當(dāng)從函數(shù)返回時(shí),stack指針指向存放先前執(zhí)行地址的位置,也就是說(shuō),stack空間內(nèi)分配的元素已被刪除。這就是為什么函數(shù)內(nèi)的變量此時(shí)無(wú)效,因?yàn)樗鼈円呀?jīng)被推出了stack,另外要注意的是,聲明一個(gè)靜態(tài)變量,它沒(méi)有進(jìn)入stack中。
另一種由應(yīng)用程序管理的內(nèi)存區(qū)域是堆(heap),heap是儲(chǔ)存應(yīng)用程序的內(nèi)存分配需求,并且分離于程序代碼和stack,heap中分配的對(duì)象的總的空間受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存。
C程序通常使用malloc和free分配和回收heap內(nèi)存,在C++中,使用new和delete.
4.函數(shù)里的變量一般是stack,用new和malloc分配的是heap
stack是有大小限制的,heap的大小與系統(tǒng)虛擬內(nèi)存差不多
stack運(yùn)算比heap快
stack由編譯器來(lái)管理,heap由程序員new, malloc, delete, free
5.heap____自由存儲(chǔ)區(qū)
stack____局部存儲(chǔ)區(qū)
通常意義上的堆棧一般指的就是棧
添加回答
舉報(bào)