面試集錦--堆與棧的區別

1、在申請方式上的不同:棧是系統自動分配的,使用完後系統自動刪除。堆是手動分配,使用完後手動刪除。

2、系統響應的不同:只要棧的剩餘空間大於所申請的空間,系統就會爲程序提供內存,否則系統提示棧溢出錯誤。

但是系統收到堆申請空間,系統會遍歷用於記錄空閒內存的鏈表,直到找到滿足大小的內存空間,,當找到後,系統就從內存空閒鏈表中刪除,將該段內存分配給堆,同時在該段內存中的首地址處標記堆的大小。如果這段內存沒有被堆使用完,則剩餘的空間再加到空閒鏈表中。

3、空間大小的不同:在windows下棧是一塊連續的區域,大小事2M或其他。總之該數值在編譯時就是一個確定的常數。加入申請的棧內存過大,就會導致棧溢出,不能指望棧能分配更多的內存。而堆是不連續的內存區域,堆的大小是由系統中虛擬內存來決定的。

4、執行效率的不同:棧是自動分配,效率快。堆是手動分配效率慢,而且容易產生內存碎片。

5、申請空間命名方式不同:棧是有名分配,可以用其名字來訪問,堆是匿名分配,只能用指針訪問。

6、函數調用方式不同:在棧中被調用函數的下一行先進棧,然後是從右往左參數進棧,然後是局部變量進棧。然後按照先進後出的原則依次出棧並處理數據。

在堆中內存區域不連續,因此在使用時必須由程序員來安排。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章