在計算機中,儲存區域主要分為:
他們的執行速率自下而上加快,與之相應的造價越高。其中,硬碟的執行效率最慢,暫存器的效率最快。
在c++ 中,記憶體主要分為五個區,分別是:
**區是用來儲存程式的所有**,以及字串常量等在編譯期間就能確定的值,在程式的整個生命週期內, 在常量資料區的資料都是可用的。在這個區域內,所有的資料都是唯讀的,不可以修改本區域的資料,之所以這樣,是因為在實際的實現中,最底層內部儲存格式的實現會使用特定的優化方案。比如說,編譯器可能只把字串常量儲存一次,而在幾個重疊的物件裡面引用它。
是用來儲存全域性靜態變數的儲存區域。只有在程式啟動的時候才被分配,直到程式開始執行時才被初始化,比如:函式的靜態變數就是在程式執行到定義該變數的**時才被初始化的。在靜態區資料區中沒有被初始化的區域可以通過void*
指標來訪問或操縱,但是static
定義的靜態變數只能在本檔案中使用,不可在其它檔案中宣告使用。
棧區主要存放編譯器在需要的時候自動分配,在不需要的時候自動銷毀的變數。主要是區域性變數和函式的引數等,在函式呼叫和傳參的時候,編譯器為區域性變數或形參開闢空間,注意,在這塊空間中,編譯器並不會自動對它進行任何的初始化,它所儲存的不是0,而是乙個隨機值(可能是該儲存區上次被使用後的值),在函式結束後,所開闢的空間將自動銷毀,裡面所存的內容將不復存在,也就是釋放儲存區的內容。 這就是為什麼老師們在講課中,最喜歡用的字眼:引數壓棧和彈出。
堆區是乙個動態的儲存區域,使用庫函式malloc()
和free()
,和操作符new
和delete
以及一些相關變數來進行分配和**,在堆區中,物件的生命週期可以比它存在記憶體中的生命周期短,換句話說:程式可以獲得一片記憶體區域而不用馬上對它進行初始化,同時,在物件被銷毀後,也不用馬上收回它所占用的記憶體區,在這段時間內,使用者可以還可以用void*
型的指標訪問這片區域,但是原始物件的非靜態區以及成員函式都不能被訪問或者操縱,因為我們知道實際上物件已經不存在了。
malloc
開闢空間型別大小需手動計算,new
是由編譯器自己計算。
malloc
返回型別為void*
,必須強制型別轉換對應型別指標,new
則直接返回對應型別指標。
malloc
開闢記憶體時返回記憶體位址要檢查判空,因為若它可能開闢失敗會返回null
,new
則不用判斷,因為記憶體分配失敗時,它會丟擲異常bac_alloc
,可以使用異常機制。
無論釋放幾個空間大小,free
只傳遞指標,多個物件時delete
需加。
malloc
、free
只是開闢空間並釋放,new
、delete
則不僅會開闢空間,還呼叫建構函式和析構函式進行初始化和清理。
new
、delete
底層是基於malloc
、free
來實現的,而malloc
、free
不能基於new
、delete
實現。
因為new
、delete
是操作符,它呼叫operator new
、operator delete
,它們可以被過載,在標準庫里它有8個過載版本,而malloc
、free
不可以過載。
對於malloc
分配記憶體後,若在使用過程中記憶體分配不夠或太多,這時可以使用realloc
函式對其進行擴充或縮小,但是new
分配好的記憶體不能這樣被直觀簡單的改變。
對於new
、delete
若記憶體分配失敗,使用者可以指定處理函式或重新制定分配器new_handler(可以在此處進行擴充套件),malloc
、free
使用者是不可以處理的。
malloc
是在堆上分配記憶體的,但new
其實不能說是在堆上,c++中,對new
申請記憶體位置有乙個抽象概念,它為自由儲存區,它可以在堆上,也可以在靜態儲存區上分配,這主要取決於operator new
實現細節,取決與它在**為物件分配空間。
計算機記憶體分配 管理
當我們寫完乙個程式後,編譯 鏈結 執行,表面看似很簡單,其實程式執行過程中,記憶體為我們的程式做了很多事。我們先來看乙個圖 一般我們將記憶體分為 堆區 棧區 全域性區 區 常量區,各個區域存放的內容 棧區 在程式中所建立的區域性變數 引數 陣列 指標等,當程式執行完後,將釋放所占用的該塊記憶體。堆區...
計算機記憶體管理介紹
計算機作業系統記憶體管理是十分重要的,因為其中涉及到很多設計很多演算法。深入理解計算機系統 這本書曾提到過,現在作業系統儲存的設計就是 帶著鐐銬跳舞 造成計算機一種一種容量多,速度快的假象。包括現在很多系統比如資料庫系統的設計和作業系統做法相似。所以在學習作業系統之餘我來介紹並總結一些作業系統的記憶...
計算機記憶體
1.1 計算機硬體記憶體架構。計算機cpu central processing unit 和記憶體的互動是最頻繁的,記憶體是我們的快取記憶體區。使用者磁碟和cpu的互動,而cpu運轉速度越來越快,磁碟遠遠跟不上cpu的讀寫速度,才設計了記憶體,使用者快取使用者io等待導致cpu的等待成本。但是隨著...