堆疊一直傻傻分不清。在參考了大多數資料後有必要為自己保留一下,以防忘記。大一時候自認為了解得還挺清楚,沒想到前個星期筆試就跪在這類題上了。
不同點:
管理方式:對於棧來講,由編譯器自動管理,無需程式設計師手工控制,而對於堆來講則需要程式設計師申請及釋放。
空間大小:棧的空間一般較小,但是可以再編譯器中修改,而堆的空間相對較大。
碎片問題:對於堆來講,頻繁的new/delete勢必會造成記憶體空間的不連續,產生大量的碎片
生長方向:堆:向記憶體增大的方向生長,而棧向記憶體減小的方向生長
分配方式:堆為動態分配,而棧有靜態分配及動態分配兩種,靜態分配由編譯器自動完成,如區域性變數的分配,而動態分配由alloca函式完成。注意棧的動態分配與堆的動態分配時不同的,他的動態分配由編譯器進行釋放。
使用效率:堆的效率比棧低,壓棧出棧有專門的指令進行執行,這決定了棧的效率比堆高,當堆需要申請記憶體時,需要在堆記憶體中進行搜尋合適的空間。
例子:int *p = new int[5];
申請了一塊堆記憶體,而指標p則為一塊棧記憶體,這句話的意思就是在棧記憶體中存放了乙個指向一塊堆記憶體的指標p
堆疊一般指堆。。
malloc/free 及new/delete的區別:
eg:int * p = (int *)malloc(sizeof(int));
int *p = new int[2];
malloc的返回值為void* 所以在使用時需進行顯示的強制轉換型別,malloc本身並不識別需要申請記憶體的型別,只關心大小
而new函式內建了型別檢查,型別轉換,sizeof等功能。用起來比較簡單。
還有乙個就是在使用delete陣列指標時需要加入,如:delete p;
堆,棧,堆疊的區別
乙個程式一般分為3段 text段,data段,bss段 text段 就是放程式 的,編譯時確定,唯讀,data段 存放在編譯階段 而非執行時 就能確定的資料,可讀可寫 就是通常所說的靜態儲存區,賦了初值的全域性變數和靜態變數存放在這個區域,常量也存放在這個區域 bss段 定義而沒有賦初值的全域性變數...
佇列 堆 棧 堆疊的區別?
佇列是先進先出 就像一條路,有乙個入口和乙個出口,先進去的就可以先出去。而棧就像乙個箱子,後放的在上邊,所以後進先出。程序中每個執行緒都有自己的堆疊,這是一段執行緒建立時保留下的位址區域。我們的 棧記憶體 即在此。至於 堆 記憶體,我個人認為在未用new定義時,堆應該就是未 保留 未 提交 的自由空...
堆 棧和堆疊的區別
堆 heap 堆是一種經過排序的樹形資料結構,每個結點都有乙個值。棧 stack 它是一種具有後進先出性質的資料結構,也就是說後存放的先取,先存放的後取。ps 頗有砌牆的磚 後來者居上的趕腳。1,申請方式 heap 程式設計師自己申請,並指明大小。stack 由系統分配。2,申請效率 原為 heap...