計算機記憶體管理

2021-10-07 01:24:14 字數 2515 閱讀 4818

在計算機中,儲存區域主要分為:

他們的執行速率自下而上加快,與之相應的造價越高。其中,硬碟的執行效率最慢,暫存器的效率最快。

在c++ 中,記憶體主要分為五個區,分別是:

**區是用來儲存程式的所有**,以及字串常量等在編譯期間就能確定的值,在程式的整個生命週期內, 在常量資料區的資料都是可用的。在這個區域內,所有的資料都是唯讀的,不可以修改本區域的資料,之所以這樣,是因為在實際的實現中,最底層內部儲存格式的實現會使用特定的優化方案。比如說,編譯器可能只把字串常量儲存一次,而在幾個重疊的物件裡面引用它。

是用來儲存全域性靜態變數的儲存區域。只有在程式啟動的時候才被分配,直到程式開始執行時才被初始化,比如:函式的靜態變數就是在程式執行到定義該變數的**時才被初始化的。在靜態區資料區中沒有被初始化的區域可以通過void*指標來訪問或操縱,但是static定義的靜態變數只能在本檔案中使用,不可在其它檔案中宣告使用。

棧區主要存放編譯器在需要的時候自動分配,在不需要的時候自動銷毀的變數。主要是區域性變數和函式的引數等,在函式呼叫和傳參的時候,編譯器為區域性變數或形參開闢空間,注意,在這塊空間中,編譯器並不會自動對它進行任何的初始化,它所儲存的不是0,而是乙個隨機值(可能是該儲存區上次被使用後的值),在函式結束後,所開闢的空間將自動銷毀,裡面所存的內容將不復存在,也就是釋放儲存區的內容。 這就是為什麼老師們在講課中,最喜歡用的字眼:引數壓棧和彈出。

堆區是乙個動態的儲存區域,使用庫函式malloc()free(),和操作符newdelete以及一些相關變數來進行分配和**,在堆區中,物件的生命週期可以比它存在記憶體中的生命周期短,換句話說:程式可以獲得一片記憶體區域而不用馬上對它進行初始化,同時,在物件被銷毀後,也不用馬上收回它所占用的記憶體區,在這段時間內,使用者可以還可以用void*型的指標訪問這片區域,但是原始物件的非靜態區以及成員函式都不能被訪問或者操縱,因為我們知道實際上物件已經不存在了。

malloc開闢空間型別大小需手動計算,new是由編譯器自己計算。

malloc返回型別為void*,必須強制型別轉換對應型別指標,new則直接返回對應型別指標。

malloc開闢記憶體時返回記憶體位址要檢查判空,因為若它可能開闢失敗會返回nullnew則不用判斷,因為記憶體分配失敗時,它會丟擲異常bac_alloc,可以使用異常機制。

無論釋放幾個空間大小,free只傳遞指標,多個物件時delete需加

mallocfree只是開闢空間並釋放,newdelete則不僅會開闢空間,還呼叫建構函式和析構函式進行初始化和清理。

newdelete底層是基於mallocfree來實現的,而mallocfree不能基於newdelete實現。

因為newdelete是操作符,它呼叫operator newoperator delete,它們可以被過載,在標準庫里它有8個過載版本,而mallocfree不可以過載。

對於malloc分配記憶體後,若在使用過程中記憶體分配不夠或太多,這時可以使用realloc函式對其進行擴充或縮小,但是new分配好的記憶體不能這樣被直觀簡單的改變。

對於newdelete若記憶體分配失敗,使用者可以指定處理函式或重新制定分配器new_handler(可以在此處進行擴充套件),mallocfree使用者是不可以處理的。

malloc是在堆上分配記憶體的,但new其實不能說是在堆上,c++中,對new申請記憶體位置有乙個抽象概念,它為自由儲存區,它可以在堆上,也可以在靜態儲存區上分配,這主要取決於operator new實現細節,取決與它在**為物件分配空間。

計算機記憶體分配 管理

當我們寫完乙個程式後,編譯 鏈結 執行,表面看似很簡單,其實程式執行過程中,記憶體為我們的程式做了很多事。我們先來看乙個圖 一般我們將記憶體分為 堆區 棧區 全域性區 區 常量區,各個區域存放的內容 棧區 在程式中所建立的區域性變數 引數 陣列 指標等,當程式執行完後,將釋放所占用的該塊記憶體。堆區...

計算機記憶體管理介紹

計算機作業系統記憶體管理是十分重要的,因為其中涉及到很多設計很多演算法。深入理解計算機系統 這本書曾提到過,現在作業系統儲存的設計就是 帶著鐐銬跳舞 造成計算機一種一種容量多,速度快的假象。包括現在很多系統比如資料庫系統的設計和作業系統做法相似。所以在學習作業系統之餘我來介紹並總結一些作業系統的記憶...

計算機記憶體

1.1 計算機硬體記憶體架構。計算機cpu central processing unit 和記憶體的互動是最頻繁的,記憶體是我們的快取記憶體區。使用者磁碟和cpu的互動,而cpu運轉速度越來越快,磁碟遠遠跟不上cpu的讀寫速度,才設計了記憶體,使用者快取使用者io等待導致cpu的等待成本。但是隨著...