數(shù)據(jù)結(jié)構(gòu)中堆和二叉排序樹的區(qū)別 請問棧和堆究竟有何區(qū)別?
請問棧和堆究竟有何區(qū)別?棧,在負(fù)責(zé)執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元都可以不在棧上創(chuàng)建角色,函數(shù)不能執(zhí)行結(jié)束了時這些存儲單元自動出現(xiàn)被施放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,只不過分配
請問棧和堆究竟有何區(qū)別?
棧,在負(fù)責(zé)執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元都可以不在棧上創(chuàng)建角色,函數(shù)不能執(zhí)行結(jié)束了時這些存儲單元自動出現(xiàn)被施放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,只不過分配的內(nèi)存容量有限。
堆,應(yīng)該是那些由fun分配的內(nèi)存塊,他們的釋放者編譯器不去管,由我們的應(yīng)用程序去壓制,好象一個new現(xiàn)在就要填寫一個delete。如果程序員是沒有施放掉,那么在程序結(jié)束了后,操作系統(tǒng)會不自動回收公司。
堆和棧通常的區(qū)別有100元以內(nèi)幾點(diǎn):
1、管理有所不同;
2、空間大小相同;
3、是否可以再產(chǎn)生碎片完全不同;
4、生長方向相同;
5、分配差別;
6、怎么分配效率完全不同;
管理這對棧來講,是由編譯器不自動管理,不需我們手工控制;對于堆來說,能量工作由程序員壓制,不容易再產(chǎn)生memoryleak。
空間大?。合袷莵碇v在32位系統(tǒng)下,堆內(nèi)存可以達(dá)到4G的空間,這個堆內(nèi)存簡直是沒有什么限制的。但是對于棧來講,就像也是有是有的空間大小的,.例如,在VC6下面,設(shè)置的??臻g大小是1M(像是,記不很清楚了)。不過,我們可以不可以修改:
可以打開工程,左面不能操作菜單如下:Project-gtSetting-gtLink,在Category中左鍵單擊Output,然后把在Reserve中設(shè)置堆棧的的最值和commit。
再注意:reserve最小值為4Byte;commit是記錄在虛擬內(nèi)存的頁文件里面,它設(shè)置里的較高會使棧開辟出來減小的值,肯定提高內(nèi)存的開銷和正常啟動時間。
碎片問題:對于堆來講,很頻繁的new/delete必然會造成內(nèi)存空間的不在不,使照成大量的碎片,使程序效率降低。對于棧來講,則絕對不會必然這個問題,畢竟棧是先進(jìn)后出的隊(duì)列,他們是極為的直接對應(yīng),使得永遠(yuǎn)都不可能有一個內(nèi)存塊從棧中間彈出對話框,在他彈出之前,在他上面的后進(jìn)的棧內(nèi)容巳經(jīng)被自動彈出,具體點(diǎn)的這個可以建議參考數(shù)據(jù)結(jié)構(gòu),這里我們就不再繼續(xù)一一繼續(xù)討論了。
生長方向:這對堆來講,生長方向是往上的,也就是朝內(nèi)存地址提高的方向;相對于棧來講,它的生長方向是往上的,是朝著內(nèi)存地址會增大的方向增長。
分配堆大都日志分配的,沒有支持靜態(tài)分配的堆。棧有2種分配動態(tài)和靜態(tài)分配和動態(tài)分配。靜態(tài)分配是編譯器成功的,例如局部變量的分配。代碼分配由alloca函數(shù)并且分配,只不過棧的閃圖分配和堆是有所不同的,他的代碼分配是由編譯器參與釋放,無需我們手工基于。
分配效率:棧是機(jī)器系統(tǒng)需要提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會在底層對棧需要提供支持:分區(qū)分配專門買的寄存器貯存棧的地址,壓棧出棧也有專門買的指令負(fù)責(zé)執(zhí)行,這就決定了棧的效率比較好高。堆則是C/C函數(shù)庫需要提供的,它的機(jī)制是很奇怪的,的或?yàn)榱朔峙湟淮髩K內(nèi)存,庫函數(shù)會聽從當(dāng)然的算法(具體的算法是可以參考數(shù)據(jù)結(jié)構(gòu)/操作系統(tǒng))在堆內(nèi)存中直接搜索后用的加上大小的空間,假如沒有相當(dāng)大小的空間(可能會是的原因內(nèi)存碎片太大),就有可能全局函數(shù)系統(tǒng)功能去提高程序數(shù)據(jù)段的內(nèi)存空間,那樣的話就有機(jī)會分到相當(dāng)大小的內(nèi)存,然后把通過前往。想來,堆的效率比棧要低得多。
從這里發(fā)現(xiàn),堆和棧而言,由于大量new/delete的使用,太容易倒致大量的內(nèi)存碎片;而沒有專業(yè)點(diǎn)的系統(tǒng)支持,效率很高;導(dǎo)致很可能直接導(dǎo)致用戶態(tài)和核心態(tài)的切換,內(nèi)存的申請,代價變得異常更加價格不菲。所以我棧在程序中是最為廣泛的,即便是函數(shù)的動態(tài)鏈接庫也用來?xiàng)Hコ晒Γ瘮?shù)調(diào)用過程中的參數(shù),前往地址,EBP和局部變量都按結(jié)構(gòu)棧的能保存。所以才,我們推薦一下大家最好就是用棧,而不是什么用堆。
確實(shí)棧有極為不少的好處,但導(dǎo)致和堆兩者相比又不是那就靈活自如,有的時候分配大量的內(nèi)存空間,那就用堆好一些。
無論堆應(yīng)該棧,都要避兔越界現(xiàn)象的發(fā)生(即使你是故意使其跨越雷池),而且越界的結(jié)果不是的話是程序崩散,不是的話是徹底摧毀程序的堆、棧結(jié)構(gòu),再產(chǎn)生以想不到的結(jié)果,就算是在你的程序運(yùn)行過程中,是沒有發(fā)生上面的問題,你那就要千萬小心,沒準(zhǔn)什么時候就崩掉,那時候debug不過非常難辦的。
數(shù)據(jù)結(jié)構(gòu)名詞排序?
設(shè)有n個待排序的記錄關(guān)鍵字,則在堆排序中不需要1個輔助記錄單元。
堆排序(Heapsort)是指用來堆積樹(堆)這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)什么的一種排序算法,它是你選排序的一種??梢詰{借數(shù)組的特點(diǎn)急速定位指定你索引的元素。堆統(tǒng)稱大根堆和小根堆,是幾乎完全二叉樹。大根堆的要求是每個節(jié)點(diǎn)的值都不小于其父節(jié)點(diǎn)的值,即A[PARENT[i]]A[i]。在數(shù)組的非降序排序中,需要不使用的那是大根堆,是因?yàn)閰⒄沾蟾训囊箢}意,最大的值是有在堆頂。