day4 說說堆和棧

2021-06-28 05:43:27 字數 1656 閱讀 1763

說說堆和棧

就資料結構而言,它就是乙個先進後出的線性表,是一種只能在一段進行插入和刪除操作的線性表。先進入的資料會被存入棧底,最後壓入的資料存放在棧頂。需要讀取資料的時候從棧頂開始彈出,也就是說棧中最後乙個資料將被第乙個彈出。而就計算機系統而言,棧是乙個具有以上這些屬性的動態記憶體區域。程式可以將資料壓入棧中,也可以將資料從棧頂彈出。在經典作業系統中,棧總是向下增長的。

程式棧例項

0xbfffffff                          棧底    

0xbffffffb

0xbffffff8

0xbffffff4                 <------esp

在執行pop操作的時候棧頂指標esp會向著棧底移動,esp的值會增大;在執行push的時候,esp會向背離的方向移動,此時esp的值會增大。這也就是所謂的 向下增長。

在程式中的具體作用是什麼呢?棧在程式的執行中,最重要的是棧儲存了函式呼叫時所需要的維護資訊,這也常被稱之為堆疊幀或活動記錄。堆疊幀一般需要儲存一下兩種資訊:1.函式的返回值和引數 。 2.臨時變數,包括函式的非靜態區域性變數以及編譯器自動生成的其他變數。3.儲存的上下文,函式在呼叫前後需要保持不變的暫存器。

堆  就資料結構而言,堆通常被看作乙個棵樹的陣列物件。它滿足:堆中的某個節點值總是不大於或不小於其父節點的值;堆總是乙個完全樹。

也就是說,n個元素的序列當且僅當滿足下關係時,稱之為堆。ki

<= k

2i,k

i<= k

2i+1

)或者(k

i>= k

2i,k

i>= k

2i+1

), (i = 1,2,3,4...n/2)。

計算機系統而言,堆是一塊巨大的記憶體空間,常常佔據整個記憶體空間的絕大部分。在這個空間裡,程式可以請求一塊連續的記憶體,並自由的使用。而且這塊內存在程式主動放棄之前都會一直保持有效。堆的出現其實可以說是為了彌補棧的不足,因為棧的資料在函式返回的時候會被釋放掉,所以無法傳遞至程式外部。而全域性變數是沒有辦法動態產生的,這種情況下,堆是最好的選擇。其實 通常我們使用 new 、malloc等請求的記憶體就是堆,釋放這些區域需要我們手動去完成 delete和free等釋放。 堆主要用於全域性變數和應用的儲存。

c++中堆和棧在記憶體區域的區別有那些?

a.管理方式不同。棧是由編譯自動管理,無需我們手動控制;堆是由程式設計師完成,容易產生記憶體洩露。

b.空間大小不同。一般來講,在32位系統下面堆可以達到4g空間,從這個方面來看,堆幾乎沒有人後限制的,但是對於棧來說,一般都有一定的限制。

c. 能否產生碎片。對於堆來講,頻繁的申請和釋放記憶體,會造成記憶體空間的不連續,從而造成大量的碎片,使程式的效率變低。對於棧來講,不存在這個問題,因為它的分配和釋放都是由編譯器完成。

d.生長方向不同。對於堆來講,生長方向是向上的,也是向著記憶體位址增加的地方增長,而對於棧來講,卻不是這樣,生長方向是向下的。

e.分配方式不同。堆的分配和釋放是由手工完成,而棧是由編譯器完成。

f.分配效率不同。棧是機器系統提供的資料結構,計算機會在底層對棧提供支援,分配專門的暫存器存放棧的位址,壓棧出棧都有專門的指令,這就決定了棧的效率比較高。堆則是由c/c++庫函式提供對的,機制很複雜,會按照一定的演算法進行分配。顯然堆的效率會低很多。

作業 day4 全棧考試

1.位 bit 音譯為位元,表示二進位制位。位於計算機內部資料儲存的最小單位。拓展二進位制計算方法 128 64 32 16 8 4 2 1 例如 122 0 1 1 1 1 0 1 0 0 1為二進位制位 2.位元組 bytes 習慣用大寫的b來表示。位元組是計算機中資料處理的基本單位。計算機中以...

Python全棧學習day4

一 資料型別 python資料型別 數字型別 整數 浮點數 複數 位元組型別 字串 位元組串 組合型別 集合 元組 列表 字典 1.數字型別 表示數字或數值的資料型別稱為數字型別。python語言提供3種數字型別 整數 浮點數和複數,分別對應數學中的整數 實數和複數。乙個整數值可以表示為十進位制 十...

day4作業和答案

1.已知乙個數字列表,求列表中心元素。list1 10 206,3 89,23 9,12 count len list1 if count 1 print list1 count 2 else print list1 count 2 1 list1 count 2 2.已知乙個數字列表,求所有元素和...