一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

堆-棧-動(dòng)態(tài)存儲(chǔ)方式-靜態(tài)存儲(chǔ)方式

 fisher60 2011-08-17

堆-棧-動(dòng)態(tài)存儲(chǔ)方式-靜態(tài)存儲(chǔ)方式

動(dòng)態(tài)存儲(chǔ)方式

所謂動(dòng)態(tài)存儲(chǔ)方式是指在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ)空間的方式。動(dòng)態(tài)存儲(chǔ)變量是在程序執(zhí)行過程中,使用它時(shí)才分配存儲(chǔ)單元, 使用完畢立即釋放。 典型的例子是函數(shù)的形式參數(shù),在函數(shù)定義時(shí)并不給形參分配存儲(chǔ)單元,只是在函數(shù)被調(diào)用時(shí),才予以分配, 調(diào)用函數(shù)完畢立即釋放。如果一個(gè)函數(shù)被多次調(diào)用,則反復(fù)地分配、 釋放形參變量的存儲(chǔ)單元。

靜態(tài)存儲(chǔ)方式

所謂靜態(tài)存儲(chǔ)方式是指在程序編譯期間分配固定的存儲(chǔ)空間的方式。該存儲(chǔ)方式通常是在變量定義時(shí)就分定存儲(chǔ)單元并一直保持不變, 直至整個(gè)程序結(jié)束。全局變量,靜態(tài)變量等就屬于此類存儲(chǔ)方式。

總結(jié)

從以上分析可知, 靜態(tài)存儲(chǔ)變量是一直存在的, 而動(dòng)態(tài)存儲(chǔ)變量則時(shí)而存在時(shí)而消失。我們又把這種由于變量存儲(chǔ)方式不同而產(chǎn)生的特性稱變量的生存期。 生存期表示了變量存在的時(shí)間。 生存期和作用域是從時(shí)間和空間這兩個(gè)不同的角度來描述變量的特性,這兩者既有聯(lián)系,又有區(qū)別。 一個(gè)變量究竟屬于哪一種存儲(chǔ)方式, 并不能僅從其作用域來判斷,還應(yīng)有明確的存儲(chǔ)類型說明。

內(nèi)存中用戶存儲(chǔ)空間的分配情況(三種):

 程序區(qū):存放程序語句

靜態(tài)存儲(chǔ)區(qū)存放全局變量,在程序開始執(zhí)行時(shí)給全局變量分配存儲(chǔ)區(qū),程序執(zhí)行完畢就釋放。

動(dòng)態(tài)存儲(chǔ)區(qū):存放以下數(shù)據(jù):函數(shù)形式參數(shù)。在調(diào)用函數(shù)時(shí)給形參分配存儲(chǔ)空間;自動(dòng)變量(未加static聲明的局部變量) ;函數(shù)調(diào)用時(shí)的現(xiàn)場(chǎng)保護(hù)和返回地址等;

就是那些由編輯器在需要的時(shí)候分配,在不需要的時(shí)候自動(dòng)清除的變量的存儲(chǔ)區(qū),里面的變量通常是局部變量。函數(shù)參數(shù)等。

就是那些右new分配的內(nèi)存塊,他們的釋放編輯器不去管,由我們的應(yīng)用程序去控制,一般一個(gè)new就要對(duì)應(yīng)一個(gè)delete.如果程序員沒有釋放掉,那么在程序結(jié)束后,操作系統(tǒng)會(huì)自動(dòng)回收。

堆和棧的區(qū)別主要為:

1.管理方式不同: 對(duì)于棧來講,是由編譯器自動(dòng)管理,無需我們手工控制;對(duì)于堆來說,釋放工作由程序員控制,容易產(chǎn)生memory leak。

2.能否產(chǎn)生碎片不同:對(duì)于堆來講,頻繁的new/delete勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。對(duì)于棧來講,則不會(huì)存在這個(gè)問題,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列,他

  們是如此的一一對(duì)應(yīng),以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊從棧中間彈出,在他彈出之前,在他上面的后進(jìn)的棧內(nèi)容已經(jīng)被彈出

3.生長(zhǎng)方向:對(duì)于堆來講,生長(zhǎng)方向是向上的,也就是向著內(nèi)存地址增加的方向;對(duì)于棧來講,它的生長(zhǎng)方向是向下的,是向著內(nèi)存地址減小的方向增長(zhǎng)。

4.分配方式:堆都是動(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)分配是由編譯器進(jìn)行釋放,無需我們手工實(shí)現(xiàn)。

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

總結(jié)

堆和棧相比,由于大量new/delete的使用,容易造成大量的內(nèi)存碎片;由于沒有專門的系統(tǒng)支持,效率很低;由于可能引發(fā)用戶態(tài)和核心態(tài)的切換,內(nèi)存的申請(qǐng),代價(jià)變得更加昂貴。所以棧在程序中是應(yīng)用最廣泛的,就算是函數(shù)的調(diào)用也利用棧去完成,函數(shù)調(diào)用過程中的參數(shù),返回地址,EBP和局部變量都采用棧的方式存放。所以,我們推薦大家盡量用棧,而不是用堆。   
棧有如此眾多的好處,但是由于和堆相比不是那么靈活,有時(shí)候分配大量的內(nèi)存空間,還是用堆好一些。
無論是堆還是棧,都要防止越界現(xiàn)象的發(fā)生(除非你是故意使其越界),因?yàn)樵浇绲慕Y(jié)果要么是程序崩潰,要么是摧毀程序的堆、棧結(jié)構(gòu),產(chǎn)生以想不到的結(jié)果,就算是在你的程序運(yùn)行過程中,沒有發(fā)生上面的問題,你還是要小心,說不定什么時(shí)候就崩掉,那時(shí)候debug可是相當(dāng)困難的:)  

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产水滴盗摄一区二区| 欧美精品久久99九九| 男人和女人草逼免费视频| 欧美一区日韩一区日韩一区| 香蕉久久夜色精品国产尤物| 久久碰国产一区二区三区| 两性色午夜天堂免费视频| 国产又色又爽又黄的精品视频| 美女被草的视频在线观看| 丁香六月婷婷基地伊人| 少妇人妻一级片一区二区三区| 国产精品免费无遮挡不卡视频| 年轻女房东2中文字幕| 午夜国产精品国自产拍av| 久久香蕉综合网精品视频| 人妻一区二区三区在线| 91超精品碰国产在线观看| 亚洲欧美日韩中文字幕二欧美 | 欧美老太太性生活大片| 日本黄色录像韩国黄色录像| 亚洲精品国产主播一区| 免费观看在线午夜视频| 亚洲高清中文字幕一区二区三区| 在线日韩欧美国产自拍| 亚洲三级视频在线观看免费| 精品午夜福利无人区乱码| 日韩中文高清在线专区| 亚洲午夜福利视频在线| 一区二区三区国产日韩| 日韩人妻av中文字幕| 日韩一区二区三区18| 日木乱偷人妻中文字幕在线| 日韩精品第一区二区三区| 亚洲另类女同一二三区| 久久精品中文扫妇内射| 成人免费高清在线一区二区| 日本欧美一区二区三区在线播| 精品欧美日韩一区二区三区| 国产精品一区二区香蕉视频| 日本成人中文字幕一区| 九九热精品视频免费在线播放|