當前位置:首頁 » 編程軟體 » 在線編譯器也有堆棧嗎

在線編譯器也有堆棧嗎

發布時間: 2025-01-28 14:34:44

㈠ 堆棧的定義

一個程序一般分為3段:text段,data段,bss段
text段:就是放程序代碼的,編譯時確定,只讀,
data段:存放在編譯階段(而非運行時)就能確定的數據,可讀可寫
就是通常所說的靜態存儲區,賦了初值的全局變數和靜態變數存放在這個區域,常量也存放在這個區域
bss段:定義而沒有賦初值的全局變數和靜態變數,放在這個區域

這個夠不夠清楚呢?
堆棧就是棧的簡稱。

堆和棧的區別
一、預備知識—程序的內存分配
一個由c/C++編譯的程序佔用的內存分為以下幾個部分
1、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧。
2、堆區(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表,呵呵。
3、全局區(靜態區)(static)—,全局變數和靜態變數的存儲是放在一塊的,初始化的全局變數和靜態變數在一塊區域, 未初始化的全局變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程序結束後有系統釋放
4、文字常量區—常量字元串就是放在這里的。 程序結束後由系統釋放
5、程序代碼區—存放函數體的二進制代碼。
二、例子程序
這是一個前輩寫的,非常詳細
//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);
分配得來得10和20位元組的區域就在堆區。
strcpy(p1, "123456"); 123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。
}

二、堆和棧的理論知識
2.1申請方式
stack:
由系統自動分配。 例如,聲明在函數中一個局部變數 int b; 系統自動在棧中為b開辟空間
heap:
需要程序員自己申請,並指明大小,在c中malloc函數
如p1 = (char *)malloc(10);
在C++中用new運算符
如p2 = (char *)malloc(10);
但是注意p1、p2本身是在棧中的。

2.2
申請後系統的響應
棧:只要棧的剩餘空間大於所申請空間,系統將為程序提供內存,否則將報異常提示棧溢出。
堆:首先應該知道操作系統有一個記錄空閑內存地址的鏈表,當系統收到程序的申請時,
會遍歷該鏈表,尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閑結點鏈表中刪除,並將該結點的空間分配給程序,另外,對於大多數系統,會在這塊內存空間中的首地址處記錄本次分配的大小,這樣,代碼中的delete語句才能正確的釋放本內存空間。另外,由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閑鏈表中。

2.3申請大小的限制
棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由於系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。

2.4申請效率的比較:
棧由系統自動分配,速度較快。但程序員是無法控制的。
堆是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配內存,他不是在堆,也不是在棧是直接在進程的地址空間中保留一快內存,雖然用起來最不方便。但是速度快,也最靈活。

2.5堆和棧中的存儲內容
棧: 在函數調用時,第一個進棧的是主函數中後的下一條指令(函數調用語句的下一條可執行語句)的地址,然後是函數的各個參數,在大多數的C編譯器中,參數是由右往左入棧的,然後是函數中的局部變數。注意靜態變數是不入棧的。
當本次函數調用結束後,局部變數先出棧,然後是參數,最後棧頂指針指向最開始存的地址,也就是主函數中的下一條指令,程序由該點繼續運行。
堆:一般是在堆的頭部用一個位元組存放堆的大小。堆中的具體內容有程序員安排。

2.6存取效率的比較

char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在運行時刻賦值的;
而bbbbbbbbbbb是在編譯時就確定的;
但是,在以後的存取中,在棧上的數組比指針所指向的字元串(例如堆)快。
比如:
#include
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
對應的匯編代碼
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一種在讀取時直接就把字元串中的元素讀到寄存器cl中,而第二種則要先把指針值讀到edx中,在根據edx讀取字元,顯然慢了。

2.7小結:
堆和棧的區別可以用如下的比喻來看出:
使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等准備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。

㈡ 匯編指令的堆棧是什麼意思

堆棧(Stack)是一種重要的線性數據結構,它並不是一種存儲器本身,而是我們使用存儲器的一種方法。堆棧的主要功能是提供數據暫存的便利,因此,我們可以將其簡單地理解為一種一維數組。然而,與普通的一維數組不同,一維數組允許在任何位置進行元素的插入和刪除,而堆棧的插入和刪除操作則被限定在一端進行,這一端被稱為棧頂(top),而另一端則被稱為棧底(bottom)。

向堆棧中插入數據的操作稱為壓入(Push),而從堆棧中刪除數據則稱為彈出(Pop)。這些操作都遵循後進先出(Last In First Out,簡稱LIFO)的原則,也就是說,最後壓入堆棧的元素將最先被彈出。這種特性使得堆棧非常適合用於需要管理數據進出順序的應用場景。

舉個例子,當我們使用函數調用時,函數的局部變數和參數會被壓入堆棧中,當函數執行完成後,這些數據會被彈出。同樣地,在程序的執行過程中,堆棧還可以用來保存程序的執行狀態,這對於實現遞歸調用等功能至關重要。

由於堆棧的特殊性,它在計算機科學領域具有廣泛的應用。例如,編譯器在處理程序代碼時,會使用堆棧來管理臨時變數和中間結果,以確保代碼的正確執行。此外,堆棧也是實現各種數據結構和演算法的基礎,例如,括弧匹配、表達式求值、回溯演算法等。

總的來說,堆棧是一種非常重要的數據結構,它通過提供一種高效的數據暫存機制,使得計算機程序能夠更加靈活地處理各種復雜的數據操作。

㈢ 北大青鳥java培訓:堆和棧的區別

棧:在編譯過程中分配的內存空間是由操作系統(編譯器)自動分配和釋放的,而堆棧上的空間是有限的。
在編譯過程中,程序在堆棧上同時為變數和函數分配內存,並且在堆棧上執行運行時函數調用的參數傳遞。
堆:在程序運行期間動態分配的內存空間,您可以根據程序運行的方式來確定要分配的堆內存的大小。
發行版通常由程序員分配。
內存函數的分配,如new和malloc,分配給堆。
棧是機器系統提供的數據結構,堆由C/c++函數庫提供。
棧是系統提供的功能,其特點是快速高效,缺點是有限的,數據不靈活;該堆棧是函數庫的函數,具有靈活性和方便性的特點,數據被廣泛使用,但效率可以降低。
棧是系統數據結構,它是流程/線程的唯一。
堆是函數庫的內部數據結構,不一定是唯一的。
不同堆分配的內存不能相互操作。
堆棧空間有兩種靜態分布和動態分配。
靜態分配由編譯器完成,例如自動變數(自動)分布。
動態分配由alloca函數完成。
棧的動態分配不需要釋放(自動),也沒有釋放函數。
對於便攜程序,不鼓勵動態分配堆棧。
堆空間分配是動態的,雖然在程序的末尾,所有的數據空間都將被釋放回系統中,但是精確的應用程序內存/空閑內存匹配是良好應用程序的基本要素。
堆內存用於保存由新分配的內存在堆中創建的對象和數組,並由虛擬機的自動垃圾收集器管理。
創建了一個數組或對象在堆中,堆棧可以也是一個特殊的變數,讓棧中這個變數的值等於數組或對象在堆內存地址,棧中的變數是一個數組或對象的引用變數,它可用於程序後引用變數來訪問堆中的堆棧數組或對象,引用變數是一個數組或對象名稱。
引用變數是在定義時在堆棧中分配的普通變數,並且在程序超出其范圍後會釋放引用的變數。
河北電腦培訓http://www.kmbdqn.cn/發現和數組在堆中分配和對象本身,即使您的應用程序是使用新的數組或對象聲明的一個代碼塊,數組和對象本身佔用內存不會被釋放,數組和對象沒有引用變數指向它,成為一種浪費,不在使用,但仍占據內存空間,其次是垃圾收集器在一個不確定的時間。

熱點內容
編程對孩子的好處 發布:2025-03-06 13:36:54 瀏覽:981
清除輸入法緩存 發布:2025-03-06 13:31:27 瀏覽:908
哪些汽車配置高 發布:2025-03-06 13:13:41 瀏覽:811
q5哪個配置帶bo音箱 發布:2025-03-06 13:07:13 瀏覽:21
C語言終值 發布:2025-03-06 13:07:11 瀏覽:988
數模編程語言 發布:2025-03-06 13:05:47 瀏覽:31
android顯示網頁圖片不顯示 發布:2025-03-06 12:59:57 瀏覽:23
集成電路編程 發布:2025-03-06 12:52:20 瀏覽:699
壓縮電腦C盤 發布:2025-03-06 12:52:10 瀏覽:533
逸動16cvt精英版什麼配置 發布:2025-03-06 12:46:36 瀏覽:639