版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、CCCC的內(nèi)存機(jī)制的內(nèi)存機(jī)制一.首先,在c中分為這幾個(gè)存儲(chǔ)區(qū)1.棧由編譯器自動(dòng)分配釋放2.堆一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由OS回收3.全局區(qū)(靜態(tài)區(qū)),全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。程序結(jié)束釋放4.專門放字符串常量的地方。程序結(jié)束釋放5程序代碼區(qū),存放2進(jìn)制代碼。在函數(shù)體中定義的變量通常是在棧上,用malloc
2、callocrealloc等分配內(nèi)存的函數(shù)分配得到的就是在堆上。在所有函數(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
3、“棧p2棧p3=“123456“123456post.content在常量區(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ū),編譯器可能會(huì)將它與p3所指向的“123456“優(yōu)化成一塊二.在C中,內(nèi)存分成5個(gè)區(qū),他們分別是堆、棧、自
4、由存儲(chǔ)區(qū)、全局靜態(tài)存儲(chǔ)區(qū)和常堆和棧的對(duì)比從以上知識(shí)可知,棧是系統(tǒng)提供的功能,特點(diǎn)是快速高效,缺點(diǎn)是有限制,數(shù)據(jù)不靈活;而棧是函數(shù)庫(kù)提供的功能,特點(diǎn)是靈活方便,數(shù)據(jù)適應(yīng)面廣泛,但是效率有一定降低。棧是系統(tǒng)數(shù)據(jù)結(jié)構(gòu),對(duì)于進(jìn)程線程是唯一的;堆是函數(shù)庫(kù)內(nèi)部數(shù)據(jù)結(jié)構(gòu),不一定唯一。不同堆分配的內(nèi)存無法互相操作。棧空間分靜態(tài)分配和動(dòng)態(tài)分配兩種。靜態(tài)分配是編譯器完成的,比如自動(dòng)變量(auto)的分配。動(dòng)態(tài)分配由alloca函數(shù)完成。棧的動(dòng)態(tài)分配無需釋放
5、(是自動(dòng)的),也就沒有釋放函數(shù)。為可移植的程序起見,棧的動(dòng)態(tài)分配操作是不被鼓勵(lì)的!堆空間的分配總是動(dòng)態(tài)的,雖然程序結(jié)束時(shí)所有的數(shù)據(jù)空間都會(huì)被釋放回系統(tǒng),但是精確的申請(qǐng)內(nèi)存釋放內(nèi)存匹配是良好程序的基本要素。1.碎片問題:對(duì)于堆來講,頻繁的new勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。對(duì)于棧來講,則不會(huì)存在這個(gè)問題,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列,他們是如此的一一對(duì)應(yīng),以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊從棧中間彈出,在他彈出之前
6、,在他上面的后進(jìn)的棧內(nèi)容已經(jīng)被彈出,詳細(xì)的可以參考數(shù)據(jù)結(jié)構(gòu),這里我們就不再一一討論了。2.生長(zhǎng)方向:對(duì)于堆來講,生長(zhǎng)方向是向上的,也就是向著內(nèi)存地址增加的方向;對(duì)于棧來講,它的生長(zhǎng)方向是向下的,是向著內(nèi)存地址減小的方向增長(zhǎng)。3.分配方式:堆都是動(dòng)態(tài)分配的,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動(dòng)態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動(dòng)態(tài)分配由alloca函數(shù)進(jìn)行分配,但是棧的動(dòng)態(tài)分配和堆是不同的,他的動(dòng)態(tài)分配是由編
7、譯器進(jìn)行釋放,無需我們手工實(shí)現(xiàn)。4.分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高。堆則是CC函數(shù)庫(kù)提供的,它的機(jī)制是很復(fù)雜的,例如為了分配一塊內(nèi)存,庫(kù)函數(shù)會(huì)按照一定的算法(具體的算法可以參考數(shù)據(jù)結(jié)構(gòu)操作系統(tǒng))在堆內(nèi)存中搜索可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由于內(nèi)存碎片太多),就有可能調(diào)用系統(tǒng)功能去增加程序數(shù)據(jù)段的內(nèi)存
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- cc++讀寫配置文件
- cc++面試300題1
- cc++面試問題分類大匯總
- cc++程序自動(dòng)評(píng)判系統(tǒng)【開題報(bào)告】
- cc++程序自動(dòng)評(píng)判系統(tǒng)【文獻(xiàn)綜述】
- cc++程序自動(dòng)評(píng)判系統(tǒng)【畢業(yè)設(shè)計(jì)】
- c++課程設(shè)計(jì)--程序設(shè)計(jì)基礎(chǔ)(cc++)
- cc++程序自動(dòng)評(píng)判系統(tǒng)【畢業(yè)設(shè)計(jì)+開題報(bào)告+文獻(xiàn)綜述】
- 大工19春《cc++語(yǔ)言程序設(shè)計(jì)》在線作業(yè)2滿分答案
- 大工19春《cc++語(yǔ)言程序設(shè)計(jì)》在線作業(yè)3滿分答案
- 面向新型混合內(nèi)存架構(gòu)的內(nèi)存管理機(jī)制.pdf
- 交易數(shù)據(jù)庫(kù)中的內(nèi)存機(jī)制.pdf
- 基于內(nèi)存的MapReduce系統(tǒng)效率優(yōu)化機(jī)制研究.pdf
- 虛擬化環(huán)境下的內(nèi)存節(jié)能機(jī)制研究.pdf
- 軟件內(nèi)存錯(cuò)誤的主動(dòng)容忍機(jī)制研究.pdf
- 軟硬件協(xié)同管理的異構(gòu)內(nèi)存緩存機(jī)制.pdf
- 混合內(nèi)存環(huán)境下的緩存替換機(jī)制研究.pdf
- 高可用內(nèi)存?zhèn)浞菘臻g創(chuàng)建機(jī)制.pdf
- 面向Cassandra的內(nèi)存管理機(jī)制研究與實(shí)現(xiàn).pdf
- 異構(gòu)內(nèi)存環(huán)境下的系統(tǒng)狀態(tài)管理機(jī)制.pdf
評(píng)論
0/150
提交評(píng)論