堆、棧以及靜態(tài)區(qū)域的區(qū)別

一、內(nèi)存基本構(gòu)成
可編程內(nèi)存在基本上分為這樣的幾大部分:靜態(tài)存儲(chǔ)區(qū)、堆區(qū)和棧區(qū)。他們的功能不同,對(duì)他們使用方式也就不同。

  • 堆區(qū):亦稱(chēng)動(dòng)態(tài)內(nèi)存分配。程序在運(yùn)行的時(shí)候用mallocnew申請(qǐng)任意大小的內(nèi)存,程序員自己負(fù)責(zé)在適當(dāng)?shù)臅r(shí)候用freedelete釋放內(nèi)存。動(dòng)態(tài)內(nèi)存的生存期可以由我們決定,如果某動(dòng)態(tài)內(nèi)存不再使用,需要將其釋放掉,否則就會(huì)發(fā)生內(nèi)存泄漏現(xiàn)象。
    (OC中對(duì)象存儲(chǔ)于堆中,當(dāng)對(duì)象的應(yīng)用計(jì)數(shù)為0時(shí)自動(dòng)釋放該對(duì)象)

  • 棧區(qū):在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲(chǔ)單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。
    (OC中 非對(duì)象變量 都存在棧中)

  • 靜態(tài)存儲(chǔ)區(qū):內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在。它主要存放靜態(tài)數(shù)據(jù)、全局?jǐn)?shù)據(jù)常量

二、使用時(shí)需注意的規(guī)則

  • 【規(guī)則1】用malloc 或new 申請(qǐng)內(nèi)存之后,應(yīng)該立即檢查指針值是否為NULL。防止使用指針值為NULL的內(nèi)存。
  • 【規(guī)則2】不要忘記為數(shù)組動(dòng)態(tài)內(nèi)存賦初值。防止將未被初始化的內(nèi)存作為右值使用。
  • 【規(guī)則3】避免數(shù)組指針的下標(biāo)越界,特別要當(dāng)心發(fā)生“多1”或者“少1”操作。
  • 【規(guī)則4】動(dòng)態(tài)內(nèi)存的申請(qǐng)與釋放必須配對(duì),防止內(nèi)存泄漏。
  • 【規(guī)則5】用free 或delete 釋放了內(nèi)存之后,立即將指針設(shè)置為NULL,防止產(chǎn)生野指針。

三、堆與棧的討論

1、管理方式:
  • 堆中資源由程序員控制(容易產(chǎn)生memory leak),
  • 棧中資源由編譯器自動(dòng)管理,無(wú)需手工控制。
2、系統(tǒng)響應(yīng):
  • 對(duì)于堆,應(yīng)知道系統(tǒng)有一個(gè)記錄空閑內(nèi)存地址的鏈表,當(dāng)系統(tǒng)收到程序申請(qǐng)時(shí),遍歷該鏈表,尋找第一個(gè)空間大于申請(qǐng)空間的堆結(jié)點(diǎn),刪除空閑結(jié)點(diǎn)鏈表中的該結(jié)點(diǎn),并將該結(jié)點(diǎn)空間分配給程序(大多數(shù)系統(tǒng)會(huì)在這塊內(nèi)存空間首地址記錄本次分配的大小,這樣delete才能正確釋放本內(nèi)存空間,另外系統(tǒng)會(huì)將多余的部分重新放入空閑鏈表中)。
  • 對(duì)于棧,只要棧的剩余空間大于所申請(qǐng)空間,系統(tǒng)為程序提供內(nèi)存,否則報(bào)異常提示棧溢出。
3、空間大?。?/h6>
  • 堆是不連續(xù)的內(nèi)存區(qū)域(因?yàn)橄到y(tǒng)是用鏈表來(lái)存儲(chǔ)空閑內(nèi)存地址),堆大小受限于計(jì)算機(jī)系統(tǒng)中有效虛擬內(nèi)存(32bit系統(tǒng)理論上是4G),所以堆的空間比較靈活,比較大。
  • 棧是一塊連續(xù)的內(nèi)存區(qū)域,大小是操作系統(tǒng)預(yù)定好的,windows下棧大小是2M(也有是1M,在編譯時(shí)確定,VC中可設(shè)置)。
4、碎片問(wèn)題:
  • 對(duì)于堆,頻繁的new/delete會(huì)造成大量碎片,使程序效率降低。
  • 對(duì)于棧,它是一個(gè)先進(jìn)后出的隊(duì)列,進(jìn)出一一對(duì)應(yīng),不會(huì)產(chǎn)生碎片。
5、生長(zhǎng)方向:
  • 堆向上,向高地址方向增長(zhǎng)。
  • 棧向下,向低地址方向增長(zhǎng)。
6、分配方式:
  • 堆都是動(dòng)態(tài)分配(沒(méi)有靜態(tài)分配的堆)。
  • 棧有靜態(tài)分配動(dòng)態(tài)分配,
    靜態(tài)分配由編譯器完成(如局部變量分配),
    動(dòng)態(tài)分配由alloca函數(shù)分配,但棧的動(dòng)態(tài)分配的資源由編譯器進(jìn)行釋放,無(wú)需程序員實(shí)現(xiàn)。
7、分配效率:
  • 堆由C/C++函數(shù)庫(kù)提供,機(jī)制很復(fù)雜。所以堆的效率比棧很多。
  • 棧是基于系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)在底層對(duì)棧提供支持,分配專(zhuān)門(mén)寄存器存放棧地址,棧操作有專(zhuān)門(mén)指令

四、為什么要把堆和棧區(qū)分出來(lái)

1、從軟件設(shè)計(jì)的角度看,棧代表了處理邏輯,而堆代表了數(shù)據(jù)。這種隔離、模塊化的思想,使得處理邏輯更為清晰
2、使得中的內(nèi)容可以被多個(gè)棧共享(也可以理解為多個(gè)線程訪問(wèn)同一個(gè)對(duì)象
  • 一方面這種共享提供了一種有效的數(shù)據(jù)交互方式(如:共享內(nèi)存)
  • 另一方面,堆中的共享常量和緩存可以被所有棧訪問(wèn),節(jié)省了空間
3、使得動(dòng)態(tài)增長(zhǎng)成為可能,相應(yīng)棧中只需記錄堆中的一個(gè)地址即可

棧因?yàn)檫\(yùn)行時(shí)的需要,比如保存系統(tǒng)運(yùn)行的上下文,需要進(jìn)行地址段的劃分。由于棧只能向上增長(zhǎng),因此就會(huì)限制住棧存儲(chǔ)內(nèi)容的能力。而堆不同,堆中的對(duì)象是可以根據(jù)需要?jiǎng)討B(tài)增長(zhǎng)的

4、面向?qū)ο?/code>就是堆和棧的完美結(jié)合。

對(duì)象的屬性其實(shí)就是數(shù)據(jù),存放在中;而對(duì)象的行為(方法),就是運(yùn)行邏輯,放在中。我們?cè)诰帉?xiě)對(duì)象的時(shí)候,其實(shí)即編寫(xiě)了數(shù)據(jù)結(jié)構(gòu),也編寫(xiě)的處理數(shù)據(jù)的邏輯

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在函數(shù)中定義的一些基本類(lèi)型的變量和對(duì)象的引用變量都在函數(shù)的棧內(nèi)存中分配。 當(dāng)在一段代碼塊定義一個(gè)變量時(shí),Java就...
    木有魚(yú)丸啦閱讀 631評(píng)論 0 0
  • 喜歡的話記得點(diǎn)贊 一、內(nèi)存管理:移動(dòng)設(shè)備的內(nèi)存及其有限,每一個(gè)APP所能占用的內(nèi)存是有限制的二、什么行為會(huì)增加AP...
    甘哲157閱讀 2,089評(píng)論 1 12
  • 1. 基礎(chǔ)知識(shí) 1.1、 基本概念、 功能 馮諾伊曼體系結(jié)構(gòu)1、計(jì)算機(jī)處理的數(shù)據(jù)和指令一律用二進(jìn)制數(shù)表示2、順序執(zhí)...
    yunpiao閱讀 5,780評(píng)論 1 22
  • 365期感謝二組學(xué)員 【日精進(jìn)打卡第32天】 【知~學(xué)習(xí)】 1、讀《六項(xiàng)精進(jìn)》大...
    大臉貓wjyxd閱讀 300評(píng)論 0 0
  • 二.水 除卻了山,便要言及了水。 我的家鄉(xiāng)實(shí)在是個(gè)好地方,有山有水,山水如畫(huà)。如畫(huà)的山水里,孕育了一群平山填水的好...
    雷芒閱讀 690評(píng)論 0 0

友情鏈接更多精彩內(nèi)容