當本次函式呼叫結束後,區域性變數先出棧,然後是引數,最後棧頂指標指向最開始存的位址,也就是主函式中的下一條指令,程式由該點繼續執行。
堆:一般是在堆的頭部用乙個位元組存放堆的大小。堆中的具體內容有程式設計師安排。
2.6訪問效率的比較
char s1 = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在執行時刻賦值的;
而bbbbbbbbbbb是在編譯時就確定的;
但是,在以後的訪問中,在棧上的陣列比指標所指向的字串(例如堆)快。
比如:
#include
void main()
對應的彙編**
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小結:
堆和棧的區別可以用如下的比喻來看出:
使用棧就象我們去飯館裡吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。
windows程序中的記憶體結構
在閱讀本文之前,如果你連堆疊是什麼多不知道的話,請先閱讀文章後面的基礎知識。
接觸過程式設計的人都知道,高階語言都能通過變數名來訪問記憶體中的資料。那麼這些變數在記憶體中是如何存放的呢?程式又是如何使用這些變數的呢?下面就會對此進行深入的討論。下文中的c語言**如沒有特別宣告,預設都使用vc編譯的release版。
首先,來了解一下 c 語言的變數是如何在記憶體分部的。c 語言有全域性變數(global)、本地變數(local),靜態變數(static)、暫存器變數(regeister)。每種變數都有不同的分配方式。先來看下面這段**:
#include
int g1=0, g2=0, g3=0;
int main()
編譯後的執行結果是:
0x0012ff78
0x0012ff7c
0x0012ff80
0x004068d0
0x004068d4
0x004068d8
0x004068dc
0x004068e0
0x004068e4
輸出的結果就是變數的記憶體位址。其中v1,v2,v3是本地變數,g1,g2,g3是全域性變數,s1,s2,s3是靜態變數。你可以看到這些變數在記憶體是連續分布的,但是本地變數和全域性變數分配的記憶體位址差了十萬八千里,而全域性變數和靜態變數分配的記憶體是連續的。這是因為本地變數和全域性/靜態變數是分配在不同型別的記憶體區域中的結果。對於乙個程序的記憶體空間而言,可以在邏輯上分成3個部份:**區,靜態資料區和動態資料區。動態資料區一般就是「堆疊」。「棧(stack)」和「堆(heap)」是兩種不同的動態資料區,棧是一種線性結構,堆是一種鏈式結構。程序的每個執行緒都有私有的「棧」,所以每個執行緒雖然**一樣,但本地變數的資料都是互不干擾。乙個堆疊可以通過「基位址」和「棧頂」位址來描述。全域性變數和靜態變數分配在靜態資料區,本地變數分配在動態資料區,即堆疊中。程式通過堆疊的基位址和偏移量來訪問本地變數。
堆和棧的區別(2)
0.申請方式和 方式不同 不知道你是否有點明白了。堆和棧的第乙個區別就是申請方式不同 棧 英文名稱是stack 是系統自動分配空間的,例如我們定義乙個 char a 系統會自動在棧上為其開闢空間。而堆 英文名稱是heap 則是程式設計師根據需要自己申請的空間,例如malloc 10 開闢十個位元組的...
堆和棧區別
一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它...
堆和棧區別
管理方式 棧由編譯器自動管理 堆由程式設計師控制,使用方便,但易產生記憶體洩露。生長方向 棧向低位址擴充套件 即 向下生長 是連續的記憶體區域 堆向高位址擴充套件 即 向上生長 是不連續的記憶體區域。這是由於系統用鍊錶來儲存空閒記憶體位址,自然不連續,而鍊錶從低位址向高位址遍歷。空間大小 棧頂位址和...