內(nèi)存分配方式有三種:
(1) 從靜態(tài)存儲區(qū)域分配讶迁。內(nèi)存在程序編譯的時候就已經(jīng)分配好,這塊內(nèi)存在程序的整個運行期間都存在腹侣。例如全局變量,static變量齿穗。
(2) 在棧上創(chuàng)建傲隶。在執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元都可以在棧上創(chuàng)建窃页,函數(shù)執(zhí)行結束時這些存儲單元自動被釋放跺株。棧內(nèi)存分配運算內(nèi)置于處理器的指令集中,效率很高脖卖,但是分配的內(nèi)存容量有限乒省。
(3)從堆上分配,亦稱動態(tài)內(nèi)存分配畦木。程序在運行的時候用malloc或new(C/C++)申請任意多少的內(nèi)存袖扛,程序員自己負責在何時用free或delete(C/C++)釋放內(nèi)存。動態(tài)內(nèi)存的生存期由我們決定十籍,使用非常靈活蛆封,但問題也最多。
摘自林銳第七章
內(nèi)存的靜態(tài)分配和動態(tài)分配的區(qū)別
內(nèi)存的靜態(tài)分配和動態(tài)分配的區(qū)別主要是兩個:
一是時間不同勾栗。靜態(tài)分配發(fā)生在程序編譯和連接的時候惨篱。動態(tài)分配則發(fā)生在程序調(diào)入和執(zhí)行的時候。
二是空間不同围俘。堆都是動態(tài)分配的砸讳,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動態(tài)分配界牡。靜態(tài)分配是編譯器完成的绣夺,比如局部變量的分配。動態(tài)分配由函數(shù)malloc進行分配欢揖。不過棧的動態(tài)分配和堆不同陶耍,他的動態(tài)分配是由編譯器進行釋放,無需我們手工實現(xiàn)她混。
對于一個進程的內(nèi)存空間而言烈钞,可以在邏輯上分成3個部份:代碼區(qū),靜態(tài)數(shù)據(jù)區(qū)和動態(tài)數(shù)據(jù)區(qū)坤按。動態(tài)數(shù)據(jù)區(qū)一般就是“堆椞盒溃”〕襞В“棧(stack)”和“堆(heap)”是兩種不同的動態(tài)數(shù)據(jù)區(qū)酗钞,棧是一種線性結構,堆是一種鏈式結構。進程的每個線程都有私有的“椦庾鳎”窘奏,所以每個線程雖然代碼一樣,但本地變量的數(shù)據(jù)都是互不干擾葫录。一個堆椬殴可以通過“基地址”和“棧頂”地址來描述。全局變量和靜態(tài)變量分配在靜態(tài)數(shù)據(jù)區(qū)米同,本地變量分配在動態(tài)數(shù)據(jù)區(qū)骇扇,即堆棧中。程序通過堆棧的基地址和偏移量來訪問本地變量面粮。
一般少孝,用static修飾的變量,全局變量位于靜態(tài)數(shù)據(jù)區(qū)熬苍。函數(shù)調(diào)用過程中的參數(shù)稍走,返回地址,EBP和局部變量都采用棧的方式存放冷溃。
摘自boke:http://blog.csdn.net/liuchao1986105/article/details/6724392