堆和棧基本知識

一、定義

堆棧是不同的兩種數(shù)據(jù)結(jié)構(gòu),堆:隊列優(yōu)先,先進先出。棧,先進后出。

堆??臻g分配

棧(操作系統(tǒng)):由操作系統(tǒng)自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。

堆(操作系統(tǒng)):一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時可能由OS回收,分配方式倒是類似于鏈表。

堆棧緩存方式

棧使用的是一級緩存,他們通常都是被調(diào)用時處于存儲空間中,調(diào)用完畢立即釋放。

堆則是存放在二級緩存中,生命周期由虛擬機的垃圾回收算法來決定(并不是一旦成為孤兒對象就能被回收)。所以調(diào)用這些對象的速度要相對來得低一些。

堆棧數(shù)據(jù)結(jié)構(gòu)區(qū)別

堆(數(shù)據(jù)結(jié)構(gòu)):堆可以被看成是一棵樹,如:堆排序。

棧(數(shù)據(jù)結(jié)構(gòu)):一種先進后出的數(shù)據(jù)結(jié)構(gòu)。

二、程序的內(nèi)存分配

c的程序內(nèi)存分為以下幾個部分。

舉個例子來說明程序的內(nèi)存分配

以前大神寫的例子,借鑒。

int?? a

=?? 0;全局初始化區(qū)

char

*p1;全局未初始化區(qū)

main()

{

int

b;棧

char

s[]?? =?? "abc";棧

char

*p2;棧

char

*p3?? =?? "123456";?? 123456/0在常量區(qū),p3在棧上。

static

int?? c?? =0;全局(靜態(tài))初始化區(qū)

p1??=?? (char?? *)malloc(10);

p2??=?? (char?? *)malloc(20);

分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)。

strcpy(p1,

"123456");?? 123456/0放在常量區(qū),編譯器可能會將它與p3所指向的"123456"

優(yōu)化成一個地方。

}

三、比較

棧:棧是由操作系統(tǒng)進行分配管理,存儲在內(nèi)存中的一級緩存中,所以存儲速度優(yōu)于堆在二級緩存的結(jié)構(gòu)。讀取速度快。

堆:程序員自己進行控制,有什么需求,就可以向內(nèi)存進行申請,但是容易產(chǎn)生碎片。

舉個例子:我們?nèi)ゼ揖叩曩I家具,都是現(xiàn)成的,有桌子,椅子,衣柜等。種類很多,如果你選擇直接購買的話,就類似于棧,如果你只是去學(xué)習(xí)人家的形狀和潮流的話,回來自己買工具,木頭等自己制作。那么就像是堆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在和計算機內(nèi)存打交道時,我們一定會碰到堆和棧,這兩個東西很容易搞混,那么現(xiàn)在就來梳理一下二者的關(guān)系。 棧(Stac...
    Albert陳凱閱讀 2,424評論 0 6
  • “text segment ”是應(yīng)用程序運行時應(yīng)用程序代碼存在的內(nèi)存段。每一個指令,每一個單個函數(shù)、過程、方法和執(zhí)...
    紫云夕月閱讀 7,402評論 4 20
  • 在數(shù)據(jù)結(jié)構(gòu)中堆和棧都是一種數(shù)據(jù)項按序排列的數(shù)據(jù)結(jié)構(gòu),但我們今天所說的重點并不是數(shù)據(jù)結(jié)構(gòu)中的堆和棧,而是C語言內(nèi)存分...
    Joe_HUST閱讀 411評論 0 0
  • 沒有想要每天道一聲早安晚安的人覺得其實確實很孤獨。單身的人總愛說一個人也還好,可是只是還好而已。 現(xiàn)在越來越感覺自...
    洛水塵門閱讀 273評論 1 1
  • 清明前夕,單身狗彭總,蔣公一同好基友看了好萊塢科幻愛情故事《太空旅客》,有感而發(fā)洋洋灑灑千余字的人生感悟…一時引...
    鵬仔_a29c閱讀 215評論 0 0

友情鏈接更多精彩內(nèi)容