我一直覺得記憶體是很複雜的東西......也許我把這篇文章完成的時候,我會了解一點c++的記憶體管理機制
從硬體開始
記憶體器位址空間->匯流排位址空間->cpu位址空間->虛擬記憶體位址空間->程式位址空間(邏輯位址空間)
程式位址空間對c++程式設計師來說是可見的,其他位址空間我們並不關心
通過列印pointer的值 可以得到我們設立的變數和**段在程式位址空間得分布情況
虛擬記憶體位址空間由作業系統管理,它把複雜的記憶體位址空間虛擬成乙個平坦的 巨大的虛擬記憶體位址空間
在32位機上,這一空間大小是4gb
在c++程式中 記憶體空間被分為幾個區域:
常量 棧 堆 自由儲存 全域性和靜態
#include
<
stdio.h
>
intmain()
從這段**可以看到 p1和p3位址相同(這不是一定的,取決於編譯器優化,但現在的編譯器幾乎都是)它們跟p2相隔很遠 其原因就是 字串常量儲存於常量區,常量區的值不能被修改。
但是const修飾符跟常量區無關。
exceptional c++還特別強調了一點:堆跟自由儲存之間的關係。標準中堆是malloc realloc和free這樣的c函式使用的記憶體 自由儲存是new和delete使用的記憶體 標準沒有規定他們是否相關聯 唯一可以肯定的是 malloc 和free不會用new 和delete實現。
堆跟自由儲存這樣有些曖昧的聯絡確實令人難以理解,在我的認識中 new 和delete的語義更傾向於說明性 malloc和free更傾向於過程性(命令性),即new和delete只關心結果 malloc和free則明確規定了實現方式。相應地,自由儲存和堆的語義也有類似的關係,一般來說 自由儲存由堆來實現是很自然的。
棧是乙個跟組合語言中棧幾乎重疊的概念,在c++中 棧負責函式引數傳遞和函式區域性變數儲存(包括main),所有函式共享乙個棧,他們各自使用乙個棧段。像在彙編中一樣 棧記憶體不僅可以由push和pop操作,還能被隨機訪問。(除了棧頂指標暫存器之外,還有棧偏移指標暫存器)因此棧記憶體中的變數可以隨意使用。
全域性和靜態變數空間 凡是static修飾的變數和函式都儲存在這一空間中 全域性變數也儲存在這個空間中,其中還包括了全域性函式和類的靜態成員函式。
特別提出的是 類的非靜態成員函式不在其中,類的非靜態成員函式不允許取位址,也無法通過函式指標訪問。甚至型別強制轉換都被不允許。換句話說,類的成員函式就好像不在記憶體中一樣。
C C 記憶體管理
寫乙個好的c 程式,我們要懂得好多東西,比如說最基本的物件導向程式設計思想,c 的封裝 繼承 多型機制,設計模式等,還有乙個很重要的內容便是效能優化,像c c 這種接近底層的語言,追求的就是效能,與之相關的一項內容便是記憶體管理,記憶體分配要合理,禁止破壞記憶體,不能有記憶體洩漏,操作不好的話,程式...
C C 記憶體管理
1.相同點 失敗 null 2 使用之前都要進行判斷是否為空 3 釋放空間的方式 free 4 返回值 void 可以強制型別轉換 2.不同點 1 malloc 引數 位元組數 功能 負責將空間給出 2 calloc 引數 單個元素位元組數,元素個數 功能 給出空間,且對空間進行初始化為0 若p為n...
C C 記憶體管理
首先來看一下c c 中記憶體的分布 棧區 又稱作堆疊,非靜態區域性變數,函式引數,返回值都是儲存在棧區的,函式棧幀的建立也是在棧區的 一般棧區的大小只有十幾m 資料段 存放靜態資料和全域性資料的。段 存放可執行的 和唯讀常量。了解完記憶體的分布接下來我們來了解記憶體的管理方式 在c語言中記憶體的管理...