更新時(shí)間:2021-08-23 11:23:06 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1100次
如圖一所示,在計(jì)算機(jī)中,主要分為以上存儲區(qū)域中,分別是:硬盤、內(nèi)存、高級緩存 和寄存器。執(zhí)行程序后,他們的運(yùn)行速率自下而上(圖一)加快,與之相應(yīng)的造價(jià)越高,其中,硬盤的運(yùn)行效率最慢,寄存器的效率最快。在這幾個(gè)區(qū)域里,重點(diǎn)介紹一下內(nèi)存。在C++ 中,內(nèi)存主要分為五個(gè)區(qū),分別是:代碼區(qū)、棧區(qū)、堆區(qū)、靜態(tài)(全局)數(shù)據(jù)區(qū)。
1.代碼區(qū):
代碼區(qū)是用來儲存程序的所有代碼,以及字符串常量等在編譯期間就能確定的值,在程序的整個(gè)生命周期內(nèi), 在常量數(shù)據(jù)區(qū)的數(shù)據(jù)都是可用的。在這個(gè)區(qū)域內(nèi),所有的數(shù)據(jù)都是只讀的,不可以修改本區(qū)域的數(shù)據(jù),之所以這樣,是因?yàn)樵趯?shí)際的實(shí)現(xiàn)中,最底層內(nèi)部存儲格式的實(shí)現(xiàn)會使用特定的優(yōu)化方案。比如說,編譯器可能只把字符串常量存儲一次,而在幾個(gè)重疊的對象里面引用它 。
2.棧區(qū):
(1)定義:
棧區(qū)主要存放編譯器在需要的時(shí)候自動(dòng)分配,在不需要的時(shí)候自動(dòng)銷毀的變量。主要是局部變量和函數(shù)的參數(shù)等,在函數(shù)調(diào)用和傳參的時(shí)候,編譯器為局部變量或形參開辟空間,注意,在這塊空間中,編譯器并不會自動(dòng)對它進(jìn)行任何的初始化,它所保存的不是0,而是一個(gè)隨機(jī)值(可能是該儲存區(qū)上次被使用后的值),在函數(shù)結(jié)束后,所開辟的空間將自動(dòng)銷毀,里面所存的內(nèi)容將不復(fù)存在,也就是釋放存儲區(qū)的內(nèi)容。 這就是為什么老師們在講課中,最喜歡用的字眼:參數(shù)壓棧和彈出。
(2)易錯(cuò)點(diǎn):
在這里,不得不說明,當(dāng)一個(gè)自動(dòng)變量的地址被存儲在一個(gè)生命期長于它的指針時(shí),自動(dòng)變量被釋放后,該指針就成了一個(gè)“懸空指針”,這一點(diǎn)是非??膳碌?,因?yàn)?ldquo;懸空指針的內(nèi)容無法預(yù)測的”
3.全局靜態(tài)(數(shù)據(jù))區(qū):
全局(靜態(tài))數(shù)據(jù)區(qū):顧名思義,它是用來存儲全局靜態(tài)變量的存儲區(qū)域。只有在程序啟動(dòng)的時(shí)候才被分配,直到程序開始執(zhí)行時(shí)才被初始化,比如:函數(shù)的靜態(tài)變量就是在程序執(zhí)行到定義該變量的代碼時(shí)才被初始化的。在靜態(tài)區(qū)數(shù)據(jù)區(qū)中沒有被初始化的區(qū)域可以通過void* 指針來訪問或操縱,但是,static定義的靜態(tài)變量只能在本文件中使用,不可在其它文件中聲明使用。
4.堆區(qū):
(1)定義:
堆區(qū)是一個(gè)動(dòng)態(tài)的存儲區(qū)域,使用庫函數(shù)malloc()和free(),和操作符new和delete以及一些相關(guān)變量來進(jìn)行分配和回收,在堆區(qū)中,對象的生命周期可以比它村在內(nèi)存中的生命周期短,換句話說:程序可以獲得一片內(nèi)存區(qū)域而不用馬上對它進(jìn)行初始化,同時(shí),在對象被銷毀后,也不用馬上收回它所占用的內(nèi)存區(qū),在這段時(shí)間內(nèi),用戶可以還可以用void*型的指針訪問這片區(qū)域,但是原始對象的非靜態(tài)區(qū)以及成員函數(shù)都不能被訪問或者操縱,因?yàn)槲覀冎缹?shí)際上對象已經(jīng)不存在了。
1.好奇心不僅害死貓:
(1)數(shù)組元素的存儲方式:int array[8];
如圖所示,數(shù)組元素在內(nèi)存中是連續(xù)存放的,當(dāng)一個(gè)數(shù)組被聲明時(shí), 它所需要的內(nèi)存在編譯時(shí)就被分配。但是,在創(chuàng)建數(shù)組時(shí),須用一個(gè)常量來指定該數(shù)組的長度,而數(shù)組本身長度常常在運(yùn)行時(shí)才知道,它所占內(nèi)存空間的大小便取決于輸入數(shù)據(jù),在這種情況下,我們通常采取的解決辦法便是聲明一個(gè)比較大的數(shù)組,以確保它能夠容納足夠多的數(shù)據(jù)。
2.優(yōu)缺點(diǎn):
(1)優(yōu)點(diǎn):定義數(shù)組時(shí)簡單、數(shù)組大小一目了然。
(2)缺點(diǎn):有以下三點(diǎn)
1)此類聲明在程序中引入了人為的限制,如果程序需要使用的元素?cái)?shù)量超過了先前聲明的長度,則無法處理。
2)解決(1)中的問題,毫無疑問會想到把數(shù)組的聲明更大一些,但是,如果程序的元素?cái)?shù)量比較少時(shí),會造成大量的空間被浪費(fèi)掉(如圖三)
3)若元素個(gè)數(shù)遠(yuǎn)遠(yuǎn)大于數(shù)組容納范圍時(shí),程序因做出合理的響應(yīng),不應(yīng)該由此失敗
那么,這時(shí)候,人們好奇,有沒有一種可能,使得我要多大的的內(nèi)存就有多大? 我想存什么類型的數(shù)據(jù)就開辟相應(yīng)字節(jié)大小的空間呢?正是因?yàn)檫@些好奇心的出現(xiàn),才有了我們現(xiàn)在的動(dòng)態(tài)內(nèi)存分配。
以上就是動(dòng)力節(jié)點(diǎn)小編介紹的"內(nèi)存堆棧分配",希望對大家有幫助,想了解更多可查看Java堆棧。動(dòng)力節(jié)點(diǎn)在線學(xué)習(xí)教程,針對沒有任何Java基礎(chǔ)的讀者學(xué)習(xí),讓你從入門到精通,主要介紹了一些Java基礎(chǔ)的核心知識,讓同學(xué)們更好更方便的學(xué)習(xí)和了解Java編程,感興趣的同學(xué)可以關(guān)注一下。
初級 202925
初級 203221
初級 202629
初級 203743