c,c++內(nèi)存分配的詳細講解包括堆,棧,數(shù)據(jù)段等_第1頁
已閱讀1頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、一.在c中分為這幾個存儲區(qū)1.棧由編譯器自動分配釋放2.堆一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收3.全局區(qū)(靜態(tài)區(qū)),全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。程序結束釋放4.另外還有一個專門放常量的地方。程序結束釋放在函數(shù)體中定義的變量通常是在棧上,用malloccallocrealloc等分配內(nèi)存的函數(shù)分配得到的就是在

2、堆上。在所有函數(shù)體外定義的是全局量,加了static修飾符后不管在哪里都存放在全局區(qū)(靜態(tài)區(qū))在所有函數(shù)體外定義的static變量表示在該文件中有效,不能extern到別的文件用,在函數(shù)體內(nèi)定義的static表示只在該函數(shù)體內(nèi)有效。另外,函數(shù)中的“adgfdf“這樣的字符串存放在常量區(qū)。比如:inta=0全局初始化區(qū)p1全局未初始化區(qū)voidmain()intb棧s[]=“abc“棧p2棧p3=“123456“123456post.co

3、ntent在常量區(qū),p3在棧上staticintc=0全局(靜態(tài))初始化區(qū)p1=()malloc(10)分配得來得10字節(jié)的區(qū)域在堆區(qū)p2=()malloc(20)分配得來得20字節(jié)的區(qū)域在堆區(qū)strcpy(p1“123456“)123456post.content放在常量區(qū),編譯器可能會將它與p3所指向的“123456“優(yōu)化成一塊二.在C中,內(nèi)存分成5個區(qū),他們分別是堆、棧、自由存儲區(qū)、全局靜態(tài)存儲區(qū)和常量存儲區(qū)1.棧,就是那些由編譯

4、器在需要的時候分配,在不需要的時候自動清楚的變量的存儲區(qū)。里面的變量通常是局部變量、函數(shù)參數(shù)等。2.堆,就是那些由new分配的內(nèi)存塊,他們的釋放編譯器不去管,由我們的應用程序去控制,一般一個new就要對應一個。如果程序員沒有釋放掉,那么在程序結束后,操作系統(tǒng)會自動回收。3.自由存儲區(qū),就是那些由malloc等分配的內(nèi)存塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。4.全局靜態(tài)存儲區(qū),全局變量和靜態(tài)變量被分配到同一塊內(nèi)存中

5、,在以前的C語言中,全局變量又分為初始化的和未初始化的,在C里面沒有這個區(qū)分了,他們共同占用同一塊內(nèi)存區(qū)。棧來講,它的生長方向是向下的,是向著內(nèi)存地址減小的方向增長。3.分配方式:堆都是動態(tài)分配的,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動態(tài)分配由alloca函數(shù)進行分配,但是棧的動態(tài)分配和堆是不同的,他的動態(tài)分配是由編譯器進行釋放,無需我們手工實現(xiàn)。4.分配效率:棧是機器系統(tǒng)

6、提供的數(shù)據(jù)結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高。堆則是CC函數(shù)庫提供的,它的機制是很復雜的,例如為了分配一塊內(nèi)存,庫函數(shù)會按照一定的算法(具體的算法可以參考數(shù)據(jù)結構操作系統(tǒng))在堆內(nèi)存中搜索可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由于內(nèi)存碎片太多),就有可能調(diào)用系統(tǒng)功能去增加程序數(shù)據(jù)段的內(nèi)存空間,這樣就有機會分到足夠大小的內(nèi)存,然后進行返回。顯然,

7、堆的效率比棧要低得多。明確區(qū)分堆與棧:在bbs上,堆與棧的區(qū)分問題,似乎是一個永恒的話題,由此可見,初學者對此往往是混淆不清的,所以我決定拿他第一個開刀。首先,我們舉一個例子:voidf()intp=newint[5]這條短短的一句話就包含了堆與棧,看到new,我們首先就應該想到,我們分配了一塊堆內(nèi)存,那么指針p呢?他分配的是一塊棧內(nèi)存,所以這句話的意思就是:在棧內(nèi)存中存放了一個指向一塊堆內(nèi)存的指針p。在程序會先確定在堆中分配內(nèi)存的大小

8、,然后調(diào)用operatnew分配內(nèi)存,然后返回這塊內(nèi)存的首地址,放入棧中,他在VC6下的匯編代碼如下:00401028push14h0040102Acalloperatnew(00401060)0040102Faddesp400401032movdwdptr[ebp8]eax00401035moveaxdwdptr[ebp8]00401038movdwdptr[ebp4]eax這里,我們?yōu)榱撕唵尾]有釋放內(nèi)存,那么該怎么去釋放呢?是p么

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論