c++
記憶體管理
——
記憶體分類
moakap
在編寫程式過程中,程式設計師必須清楚程式記憶體的分配機制,合理進行記憶體管理,這樣才能得到高效的程式。同時,如果對c++記憶體分配基本概念不理解,使用不當,一方面浪費了寶貴的記憶體資源,降低了程式執行效率,另一方面還會造成程式中意想不到的錯誤。 在
c++程式中,把記憶體分為
4類,程式儲存區、靜態資料儲存區、執行時棧、自由儲存區或堆:
1、程式儲存區
包含所有函式及成員函式的機器指令。函式一旦被編譯,即被編譯為特定得機器指令,存放在程式儲存區。當程式執行時,從內從中讀取並執行指令。
這部分記憶體不允許更改,在一般情況下,指標不會指向記憶體**段中的位置。但也有特殊,如指向函式的指標,其指向即為程式儲存區存放該函式的機器指令的位置。 2、
靜態資料儲存區
此段存放所有的全域性變數,以及由
static
修飾符宣告的任意區域性變數、或類資料成員。
其中全域性變數是指在函式或類作用域之外定義的變數,通過賦值或建構函式初始化。在
main
函式開始執行之前,完成對全域性變數的初始化。
像全域性變數一樣,
static
定義的變數同樣只需分配一次記憶體,而且要在
main
開始執行之前對其進行初始化,且每個名字只能分配乙個值。之後該變數將一直存在直到執行結束。 3、
執行時棧
執行時棧是指程式執行時使用的棧,使用棧來儲存程式執行過程中的一些系統指標。
例如,呼叫函式時儲存引數和返回位址的指標。當要呼叫函式時,程式先將這返回位址指標壓棧,然後程式跳轉至呼叫函式執行,函式返回後從棧中彈出位置指標找到呼叫函式前的位置,以便繼續執行接下來的指令。
執行時棧
還用來為函式中的引數、區域性變數分配記憶體,待函式返回時從棧中釋放記憶體,允許下一次函式呼叫重用該記憶體塊。
執行時棧可以實現記憶體的重用,增加了記憶體使用效率,但使用棧儲存區域性變數有兩個主要缺點: a、
棧記憶體值的生存期取決於函式的開始和結束。即函式返回時,棧中的值就不存在了。因此,任何返回區域性變數位址的操作都是不允許的。 b、
棧為區域性變數分配記憶體時,必須已知變數要占用的記憶體空間的大小。 4、
自由儲存區或堆
在不能預知物件大小的情況下,就不能使用棧記憶體。例如在不知道陣列包含的元素數的情況下,就不能使用棧未陣列分配記憶體。
此時,就需要動態儲存分配。
堆(自由儲存區)儲存由運算子
new顯式申請空間的大小。
例如:在函式中有
employee * boss = new employee
(」lin, lisa」,68000);
上面的語句宣告了儲存在棧中的名為
boss
的指標變數。指標的值指向儲存在堆中的資料域。
其中boss
變數存放在棧空間中,指標指向的資料則存放在堆中。
參考: big c++ 中文版
C 記憶體分類
記憶體分為5個區 棧,堆,自由儲存區,全域性 靜態儲存區,常量儲存區。棧區 記憶體由編譯器再需要時自動分配和釋放。通常用來儲存區域性變數和函式引數。為執行函式而分配的區域性變數,函式引數樹,返回位址等存放在棧區 棧執行分配內置於處理器的指令之中,效率高,但是分配的記憶體容量有限。堆區 記憶體由new...
記憶體管理分類
在編寫程式過程中,程式設計師必須清楚程式記憶體的分配機制,合理進行記憶體管理,這樣才能得到高效的程式。同時,如果對c 記憶體分配基本概念不理解,使用不當,一方面浪費了寶貴的記憶體資源,降低了程式執行效率,另一方面還會造成程式中意想不到的錯誤。在c 程式中,把記憶體分為4 類,程式儲存區 靜態資料儲存...
C 記憶體管理 記憶體池
很多內容來自於網際網路,如有侵權,請告知。另外,從 收穫很多,在此表示感謝。我們寫程式經常需要 malloc 和 new 一塊記憶體出來,這些記憶體是在堆上進行分配的,在堆上分配的記憶體和在棧上分配的記憶體不同,可以長久的儲存。堆是什麼 可以把你的程序空間 想象成 4g 大小的記憶體 32 為機子上...