堆棧是什么意思?在計算機領(lǐng)域,堆棧是一個不容忽視的概念,堆棧是一種數(shù)據(jù)結(jié)構(gòu),而且是一種數(shù)據(jù)項按序排列的數(shù)據(jù)結(jié)構(gòu),只能在一端(稱為棧頂(top))對數(shù)據(jù)項進(jìn)行插入和刪除。在單片機應(yīng)用中,堆棧是個特殊的存儲區(qū),主要功能是暫時存放數(shù)據(jù)和地址,通常用來保護斷點和現(xiàn)場。
簡介
堆棧是一個特定的存儲區(qū)或寄存器,它的一端是固定的,另一端是浮動的。堆這個存儲區(qū)存入的數(shù)據(jù),是一種特殊的數(shù)據(jù)結(jié)構(gòu)。所有的數(shù)據(jù)存入或取出,只能在浮動的一端(稱棧頂)進(jìn)行,嚴(yán)格按照“先進(jìn)后出”的原則存取,位于其中間的元素,必須在其棧上部(后進(jìn)棧者)諸元素逐個移出后才能取出。在內(nèi)存儲器(隨機存儲器)中開辟一個區(qū)域作為堆棧,叫軟件堆棧;用寄存器構(gòu)成的堆棧,叫硬件堆棧。
單片機應(yīng)用中,堆棧是個特殊存儲區(qū),堆棧屬于RAM空間的一部分,堆棧用于函數(shù)調(diào)用、中斷切換時保存和恢復(fù)現(xiàn)場數(shù)據(jù)。堆棧中的物體具有一個特性:第一個放入堆棧中的物體總是被最后拿出來, 這個特性通常稱為先進(jìn)后出 (FILO—First-In/Last-Out)。 堆棧中定義了一些操作, 兩個最重要的是PUSH和POP。 PUSH(入棧)操作:堆棧指針(SP)加1,然后在堆棧的頂部加入一 個元素。POP(出棧)操作相反,出棧則先將SP所指示的內(nèi)部ram單元中內(nèi)容送入直接地址尋址的單元中(目的位置),然后再將堆棧指針(SP)減1。這兩種操作實現(xiàn)了數(shù)據(jù)項的插入和刪除。
對比分析
堆棧是計算機科學(xué)領(lǐng)域重要的數(shù)據(jù)結(jié)構(gòu),它被用于多種數(shù)值計算領(lǐng)域。表達(dá)式求值是編譯程序中較為常見的操作,在算術(shù)表達(dá)式求值的過程中,需要使用堆棧來保存表達(dá)式的中間值和運算符,堆棧使得表達(dá)式的中間運算過程的結(jié)果訪問具有了一定的自動管理能力。大部分編譯型程序設(shè)計語言具有程序遞歸特性,遞歸能夠增強語言的表達(dá)能力和降低程序設(shè)計難度。遞歸程序的遞歸深度通常是不確定的,需要將子程序執(zhí)行的返回地址保存到堆棧這種先進(jìn)后出式的結(jié)構(gòu)中,以保證子程序的返回地址的正確使用順序。函數(shù)式程序設(shè)計語言中,不同子函數(shù)的參數(shù)的種類和個數(shù)是不相同的,編譯器也是使用堆棧來存儲子程序的參數(shù)。
空間分配
棧(操作系統(tǒng)):由操作系統(tǒng)自動分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。
堆(操作系統(tǒng)): 一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時可能由OS(操作系統(tǒng))回收,分配方式倒是類似于鏈表。
緩存方式
棧使用的是一級緩存, 他們通常都是被調(diào)用時處于存儲空間中,調(diào)用完畢立即釋放。
堆則是存放在二級緩存中,生命周期由虛擬機的垃圾回收算法來決定(并不是一旦成為孤兒對象就能被回收)。所以調(diào)用這些對象的速度要相對來得低一些。