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