1.申請方式舰始。
棧由系統(tǒng)自動分配。
堆需要程序員自己申請,并指明大小悟民。
2.申請后系統(tǒng)的響應(yīng)。
棧:只要棧的剩余空間大于申請空間篷就,系統(tǒng)將為程序提供內(nèi)存射亏,否則報內(nèi)存溢出的異常。
堆:首先應(yīng)該知道操作系統(tǒng)有一個記錄空閑內(nèi)存地址的鏈表竭业,當(dāng)系統(tǒng)收到程序的申請時智润,會遍歷該鏈表,尋找第一個空間大于所申請空間的堆節(jié)點未辆,然后將該節(jié)點從空閑節(jié)點鏈表中刪除窟绷,并將該節(jié)點的空間分配給程序,如果堆節(jié)點大小大于申請空間的大小咐柜,系統(tǒng)將自動將多余的那部分重新放入空閑鏈表中兼蜈。
3.申請大小的限制。
棧是向低地址擴展的數(shù)據(jù)結(jié)構(gòu)拙友,是一塊連續(xù)的內(nèi)存區(qū)域为狸,棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在WINDOWS中遗契,棧的大小是2M辐棒,如果申請的空間超過棧的剩余空間,將提示overflow堆是向高地址擴展的數(shù)據(jù)結(jié)構(gòu)涉瘾,是不連續(xù)的內(nèi)存區(qū)域负敏,這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地址的其做,自然是不連續(xù)的妖泄,而鏈表的遍歷方向是由低地址向高地址。
堆的大小受限于計算機系統(tǒng)中有效的虛擬內(nèi)存罚渐,由此可見荷并,堆獲得的空間比較靈活青扔,也比較大谈息。
4.申請效率黎茎。
棧是由系統(tǒng)自動分配傅瞻,速度較快,但程序員無法控制溺森。
堆是由new分配的內(nèi)存屏积,一般速度比較慢姥卢,容易產(chǎn)生內(nèi)存碎片独榴,但用起來方便棺榔。
5.存儲內(nèi)容。
棧:在函數(shù)調(diào)用時当船,第一個進棧的是主函數(shù)中下一條指令的地址。然后是函數(shù)的各個參數(shù)缩幸,參數(shù)是由右往左入棧表谊,然后是函數(shù)中的局部變量爆办,注意靜態(tài)變量時不入棧的,當(dāng)本次函數(shù)調(diào)用結(jié)束后跨算,局部變量先出棧诸蚕,然后是參數(shù)背犯,最后棧頂?shù)闹羔樦赶蜃铋_始存的地址桑腮,也就是主函數(shù)中的下一條指令破讨,程序由該點繼續(xù)運行提陶。
堆:一般是在堆的頭部用一個字節(jié)存放堆的大小,堆中具體的內(nèi)容由程序員決定。
6.數(shù)據(jù)結(jié)構(gòu)铅忿。
堆實際上是優(yōu)先隊列的一種數(shù)據(jù)結(jié)構(gòu),第一個元素有最高的優(yōu)先權(quán)。
棧實際上就是滿足先進后出的性質(zhì)的數(shù)據(jù)結(jié)構(gòu)。