儲存時:
執行程式在儲存時(沒有調入到記憶體)分為**區(text)、資料區(data)和未初始化資料區(bss)3個部分。
1 **區(text segment)
存放cpu執行的機器指令(machine instructions)。通常,**區是可共享的(即另外的執行程式可以呼叫它),因為對於頻繁被執行的程式,只需要在記憶體中有乙份**即可。**區通常是唯讀的,使其唯讀的原因是防止程式意外地修改了它的指令。另外,**區還規劃了區域性變數的相關資訊。
2 資料區:
data段:該區包含了在程式中明確被初始化的全域性變數、靜態變數(包括全域性靜態變數和區域性靜態變數)。
bss段(uninitialized data segment),存入的是全域性、靜態 未初始化的變數,程式沒有儲存實際的資料,只是儲存了必要的資訊,程式執行前,系統根據資訊分配相應的新的記憶體,然後全部清0。供程式使用。所以,未初始的全域性、靜態變數在程式執行之前已經成0了。
常量儲存區:常量資料(如字串常量)
執行時:
(1)**區(text segment)
**區指令根據程式設計流程依次執行,對於順序指令,則只會執行一次(每個程序),如果反覆,則需要使用跳轉指令,如果進行遞迴,則需要借助棧來實現。
**區的指令中包括操作碼和要操作的物件(或物件位址引用)。如果是立即數(即具體的數值,如5),將直接包含在**中;如果是區域性資料,將在棧區分配空間,然後引用該資料位址;如果是bss區和資料區,在**中同樣將引用該資料位址。(2)全域性初始化資料區/靜態資料區(data segment)
只初始化一次。
(3)未初始化資料區(bss)
在執行時改變其值。
(4)棧區(stack)
由編譯器自動分配釋放,存放函式的引數值、區域性變數的值等。其操作方式類似於資料結構中的棧。每當乙個函式被呼叫,該函式返回位址和一些關於呼叫的資訊,比如某些暫存器的內容,被儲存到棧區。然後這個被呼叫的函式再為它的自動變數和臨時變數在棧區上分配空間,這就是c實現函式遞迴呼叫的方法。每執行一次遞迴函式呼叫,乙個新的棧框架就會被使用,這樣這個新例項棧裡的變數就不會和該函式的另乙個例項棧裡面的變數混淆。
(5)堆區(heap)
用於動態記憶體分配。堆在記憶體中位於bss區和棧區之間。一般由程式設計師分配和釋放,若程式設計師不釋放,程式結束時有可能由os**。
在c中分為這幾個儲存區
1.棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數、函式引數等。
2.堆,就是那些由malloc分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制。使用free釋放記憶體,如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動**。
3.自由儲存區,就是那些由new分配的記憶體塊,他和堆是十分相似的,不過它是用delete來結束自己的生命的。自由儲存是c++中通過new與delete動態分配和釋放物件的抽象概念,而堆(heap)是c語言和作業系統的術語,是作業系統維護的一塊動態分配記憶體。
4.全域性/靜態儲存區,全域性變數和靜態變數被分配到同一塊記憶體中,在以前的c語言中,全域性變數又分為初始化的和未初始化的,在c++裡面沒有這個區分了,他們共同占用同一塊記憶體區。
5.常量儲存區,這是一塊比較特殊的儲存區,他們裡面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改)
new/delete 與malloc/free的區別
參考:
c c 記憶體管理
我一直覺得記憶體是很複雜的東西.也許我把這篇文章完成的時候,我會了解一點c 的記憶體管理機制 從硬體開始 記憶體器位址空間 匯流排位址空間 cpu位址空間 虛擬記憶體位址空間 程式位址空間 邏輯位址空間 程式位址空間對c 程式設計師來說是可見的,其他位址空間我們並不關心 通過列印pointer的值 ...
C C 記憶體管理
寫乙個好的c 程式,我們要懂得好多東西,比如說最基本的物件導向程式設計思想,c 的封裝 繼承 多型機制,設計模式等,還有乙個很重要的內容便是效能優化,像c c 這種接近底層的語言,追求的就是效能,與之相關的一項內容便是記憶體管理,記憶體分配要合理,禁止破壞記憶體,不能有記憶體洩漏,操作不好的話,程式...
C C 記憶體管理
1.相同點 失敗 null 2 使用之前都要進行判斷是否為空 3 釋放空間的方式 free 4 返回值 void 可以強制型別轉換 2.不同點 1 malloc 引數 位元組數 功能 負責將空間給出 2 calloc 引數 單個元素位元組數,元素個數 功能 給出空間,且對空間進行初始化為0 若p為n...