堆棧的訪問
⑴ 堆和棧訪問效率哪個更高
樓上兩位回答都挺好的,我來總結下
第一,堆空間大,適合放數組以及 類對象(系統自帶或自定義)
第二,裡面的數據不會自動清空,這樣就可以利用指針來訪問,(自動清空數據恰好是棧的優點)。所有在使用的時候要辯證來用,如果是用指針來訪問,就用堆,千萬不能用棧
第三、效率低,因為堆空間大,所以相對來說效率會低一點
第四、使用堆長期運行,有可能會導致內存碎片問題。
綜上所述,堆和棧要結合運行,充分利用兩種的優點。建議採用內存池來管理系統所需要的內存。
⑵ 什麼是堆棧堆棧的操作方式有哪兩種
堆棧是一種執行「後進先出」演算法的數據結構。
堆棧就是這樣一種數據結構。它是在內存中開辟一個存儲區域,數據一個一個順序地存入(也就是「壓入——push」)這個區域之中。有一個地址指針總指向最後一個壓入堆棧的數據所在的數據單元,存放這個地址指針的寄存器就叫做堆棧指示器。開始放入數據的單元叫做「棧底」。數據一個一個地存入,這個過程叫做「壓棧」。在壓棧的過程中,每有一個數據壓入堆棧,就放在和前一個單元相連的後面一個單元中,堆棧指示器中的地址自動加1。讀取這些數據時,按照堆棧指示器中的地址讀取數據,堆棧指示器中的地址數自動減
1。這個過程叫做「彈出pop」。如此就實現了後進先出的原則。
最基本的操作方式
就是
入棧和出棧
⑶ 單片機中堆棧指針SP可不可以訪問程序存儲器或者提供程序存儲器的地址
i. 堆棧指針SP是不可以訪問程序存儲器的。SP是51系列單片機的特殊功能寄存器之一,位元組地址是07H,其內容始終是當前棧頂元素的地址。
ii. 程序存儲器(內外)的地址最大可從0000H~FFFFH,是固定的,有些地址甚至是特殊地址,不存在其它給程序存儲器提供地址的說法。調用子程序時(或響應中斷時)會有程序地址指針PC自動入棧,子程序(或中斷)返回時會有自動出棧。所以籠統地說也僅是PC與SP之間內容的暫時「緩存」(當然,這種說法是不正確的。)。
⑷ 堆棧的功能,操作過程和特點
堆棧其實是數據結果中的兩個概念 ,是存放數據的方式,堆:順序隨意;棧:後進先出(Last-In/First-Out)。要說用處,那就是在寫代碼的時候,有時數據存取肯定是要有規定的順序的,這個是你自己規定的,然後按照你所寫程序的用處的特點來用堆還是棧還是隊列之類的順序 追問: 程序設計時,為什麼要對堆棧指針SP重新賦值? 回答: 這不是初始化嘛
堆棧是個特殊的存儲區,主要功能是暫時存放數據和地址,通常用來保護斷點和現場。它的特點是按照先進後出的原則存取數據,這里的進與出是指進棧與出棧操作。
80C51片內RAM的部分單元可以用做堆棧。有一個8位的堆棧指針寄存器SP,專用於指出當前堆棧頂部是片內RAM的哪一個單元。80C51單片機系統復位後SP的初值為07H,也就是將從內部RAM的08H單元開始堆放信息。
但是,80C51系列的棧區不是固定的,只要通過軟體改變SP寄存器的值便可更動棧區。為了避開工作寄存器區和位定址區,SP的初值可置為2FH或更大的地址值。如果CPU在操作中要使用兩組工作寄存器,如果不使用位變數,SP的初值至少應為0FH或更大的值;如果使用位變數,SP的初值至少應為2FH或更大的值;KeilC51編譯器會自動計算SP的初始設定值,無需編程者關心。
⑸ 80486中,什麼是堆棧堆棧主要應用在哪些場合
堆棧是一種數據項按序排列的數據結構,只能在一端(稱為棧頂(top))對數據項進行插入和刪除。堆棧主要應用在:暫時存放數據和地址。對這個存儲區存入的數據,是一種特殊的數據結構。
所有的數據存入或取出,只能在浮動的一端(稱棧頂)進行,嚴格按照「先進後出」的原則存取,位於其中間的元素,必須在其棧上部(後進棧者)諸元素逐個移出後才能取出。

(5)堆棧的訪問擴展閱讀
堆棧處理器的指令可以分為四類:算術邏輯運算、堆棧調整、程序分支和存儲器訪問。堆棧指令集與常見的 RISC 處理器指令集的不同是指令的定址方式,堆棧指令多為默認定址方式,指令操作數的地址被處理器設定為某一個既定的堆棧位置,不需要將地址信息存放於指令中。
這種方式增加了堆棧處理器的指令壓縮度,但固定的操作數地址會使得指令的操作數指定不夠靈活,堆棧處理器中設計了能夠調整堆棧中數據存放順序的堆棧調整指令。
堆棧調整指令可以在同一堆棧內部和堆棧間調整數據的位置,堆棧調整指令和堆棧的先進後出特性使得堆棧中特定位置的數據可以靈活地改變。
⑹ 8051單片機堆棧
51單片機的堆棧是向上生長的,就是堆棧不為空時,棧底地址小於棧頂地址,當將數據入棧時,棧頂地址增加。還有一個技巧是,堆棧是數據存儲器的一部分,也就是說堆棧除了利用push和pop訪問,也可以通過普通的選址方法訪問,例如mov。有時我們想訪問堆棧數據,但不想改動變動棧頂,這時可以通過mov來訪問數據。還有一個書上很少提到的知識點是出棧之後,原來那個棧頂的內容並不會清零,所以我們依然可以像對待普通數據存儲器一樣訪問。
⑺ 為什麼要用堆棧,什麼是堆棧
堆棧是一種機制,計算機用它來將參量傳遞給函數,也可以用於指向局部函數變數。它的目的是賦予程序一個方便的途徑來訪問特定函數的局部數據,並從函數調用者那邊傳遞信息。堆棧的作用如同一個緩沖區,保存著函數所需要的所有信息。在函數開始的時候產生堆棧,並在結束的時候釋放它。堆棧一般是靜態的,也即意味著一旦在函數的開始創建一個堆棧,那麼堆棧就是不可以改變的。堆棧所保存的數據是可以改變的,但是堆棧的本身一般是不可以改變的。
⑻ 什麼是「堆」,"棧","堆棧","隊列",它們的區別
堆:什麼是堆?又該怎麼理解呢?
①堆通常是一個可以被看做一棵樹的數組對象。堆總是滿足下列性質:
·堆中某個節點的值總是不大於或不小於其父節點的值;
·堆總是一棵完全二叉樹。
將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。常見的堆有二叉堆、斐波那契堆等。
②堆是在程序運行時,而不是在程序編譯時,申請某個大小的內存空間。即動態分配內存,對其訪問和對一般內存的訪問沒有區別。
③堆是應用程序在運行的時候請求操作系統分配給自己內存,一般是申請/給予的過程。
④堆是指程序運行時申請的動態內存,而棧只是指一種使用堆的方法(即先進後出)。
棧:什麼是棧?又該怎麼理解呢?
①棧(stack)又名堆棧,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。
②棧就是一個桶,後放進去的先拿出來,它下面本來有的東西要等它出來之後才能出來(先進後出)
③棧(Stack)是操作系統在建立某個進程時或者線程(在支持多線程的操作系統中是線程)為這個線程建立的存儲區域,該區域具有FIFO的特性,在編譯的時候可以指定需要的Stack的大小。
堆棧:什麼是堆棧?又該怎麼理解呢?
注意:其實堆棧本身就是棧,只是換了個抽象的名字。
堆棧的特性: 最後一個放入堆棧中的物體總是被最先拿出來, 這個特性通常稱為後進先出(LIFO)隊列。 堆棧中定義了一些操作。 兩個最重要的是PUSH和POP。 PUSH操作在堆棧的頂部加入一 個元素。POP操作相反, 在堆棧頂部移去一個元素, 並將堆棧的大小減一。
堆、棧區別總結:
1.堆棧空間分配
①棧(操作系統):由操作系統自動分配釋放 ,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧。
②堆(操作系統): 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似於鏈表。
2.堆棧緩存方式
①棧使用的是一級緩存, 他們通常都是被調用時處於存儲空間中,調用完畢立即釋放。
②堆則是存放在二級緩存中,生命周期由虛擬機的垃圾回收演算法來決定(並不是一旦成為孤兒對象就能被回收)。所以調用這些對象的速度要相對來得低一些。
3.堆棧數據結構區別
①堆(數據結構):堆可以被看成是一棵樹,如:堆排序。
②棧(數據結構):一種先進後出的數據結構。
隊列:什麼是隊列?又該怎麼理解呢?
①隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。
②隊列中沒有元素時,稱為空隊列。
③建立順序隊列結構必須為其靜態分配或動態申請一片連續的存儲空間,並設置兩個指針進行管理。一個是隊頭指針front,它指向隊頭元素;另一個是隊尾指針rear,它指向下一個入隊元素的存儲位置。
④隊列採用的FIFO(first in first out),新元素(等待進入隊列的元素)總是被插入到鏈表的尾部,而讀取的時候總是從鏈表的頭部開始讀取。每次讀取一個元素,釋放一個元素。所謂的動態創建,動態釋放。因而也不存在溢出等問題。由於鏈表由結構體間接而成,遍歷也方便。(先進先出)
堆、棧、隊列之間的區別是?
①堆是在程序運行時,而不是在程序編譯時,申請某個大小的內存空間。即動態分配內存,對其訪問和對一般內存的訪問沒有區別。
②棧就是一個桶,後放進去的先拿出來,它下面本來有的東西要等它出來之後才能出來。(後進先出)
③隊列只能在隊頭做刪除操作,在隊尾做插入操作.而棧只能在棧頂做插入和刪除操作。(先進先出)
⑼ C程序中如何使用堆棧
先從大家比較熟悉的棧說起,它是一種具有後進先出性質的數據結構,也就是說後存放的先取,先存放的後取。這就如同要取出放在箱子裡面底下的東西(放入的比較早的物體),首先要移開壓在它上面的物體(放入的比較晚的物體)。而堆就不同了,堆是一種經過排序的樹形數據結構,每個結點都有一個值。通常所說的堆的數據結構,是指二叉堆。堆的特點是根結點的值最小(或最大),且根結點的兩個子樹也是一個堆。由於堆的這個特性,常用來實現優先隊列,堆的存取是隨意,這就如同在圖書館的書架上取書,雖然書的擺放是有順序的,但是想取任意一本時不必像棧一樣,先取出前面所有的書,書架這種機制不同於箱子,可以直接取出想要的書。
下面就說說C語言程序內存分配中的堆和棧,這里有必要把內存分配也提一下,一般情況下程序存放在Rom或Flash中,運行時需要拷到內存中執行,內存會分別存儲不同的信息。
內存中的棧區處於相對較高的地址以地址的增長方向為上的話,棧地址是向下增長的,棧中分配局部變數空間,堆區是向上增長的用於分配程序員申請的內存空間。另外還有靜態區是分配靜態變數,全局變數空間的;只讀區是分配常量和程序代碼空間的;以及其他一些分區。來看一個網上很流行的經典例子:
main.cpp
int a = 0; 全局初始化區
char *p1; 全局未初始化區
main()
{
int b; 棧
char s[] = "abc"; 棧
char *p2; 棧
char *p3 = "123456"; 123456\0在常量區,p3在棧上。
static int c =0; 全局(靜態)初始化區
p1 = (char *)malloc(10); 堆
p2 = (char *)malloc(20); 堆
}
堆和棧的第一個區別就是申請方式不同:棧(英文名稱是stack)是系統自動分配空間的,例如定義一個 char a;系統會自動在棧上為其開辟空間。而堆(英文名稱是heap)則是程序員根據需要自己申請的空間,例如malloc(10);開辟十個位元組的空間。由於棧上的空間是自動分配自動回收的,所以棧上的數據的生存周期只是在函數的運行過程中,運行後就釋放掉,不可以再訪問。而堆上的數據只要程序員不釋放空間,就一直可以訪問到,不過缺點是一旦忘記釋放會造成內存泄露。
