c/c++程序中內存區劃分

轉自:http://wenzongliang.iteye.com/blog/1866629ios

 操做系統啓動程序時會加載程序代碼到內存(叫程序的代碼區),而後建立進程PCB爲進程分配內存資源(數據區,32系統爲4GB)c/c++程序的數據區被c/c++分爲5個區,他們分別是全局/靜態存儲區、常量存儲區、棧、堆、自由存儲區c++

 

   全局/靜態存儲區,全局變量和靜態變量被分配到同一塊內存中,在之前的C語言中,全局變量又分爲初始化的和未初始化的,在C++裏面沒有這個區分了,他們共同佔用同一塊內存區。程序員

  常量存儲區,這是一塊比較特殊的存儲區,他們裏面存放的是常量,不容許修改。函數

  ,在執行函數時,函數內局部變量的存儲單元均可以在棧上建立,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置於處理器的指令集中,效率很高,可是分配的內存容量有限。spa

  ,就是那些由new分配的內存塊,他們的釋放編譯器不去管,由咱們的應用程序去控制,通常一個new就要對應一個delete。若是程序員沒有釋放掉,那麼在程序結束後,操做系統會自動回收。操作系統

  自由存儲區,就是那些由malloc等分配的內存塊,他和堆是十分類似的,不過它是用free來結束本身的生命的。線程

 

以一小段代碼爲例,提幾個問題blog

#include "iostream"
using namespace std;
void ss(int a)
{
int b=5;
cout<<b+a<<endl;進程

}
int main()
{
ss(5);內存

int * p=new int;

delete p;
return 0;
}

一、這個EXE一運行必然要佔用一塊內存,這塊內存是連續的嗎?

二、既然調用了函數,必定有一塊內存吧。內存是在這個EXE以內嗎?

3,自由存儲是一個概念嗎

四、int * p=new int; 這句話開闢的內存地址在EXE的範圍內嗎?

五、是何時產生的?是程序一運行的時候?仍是調用函數的時候-

--------------------------------------

 

1. exe運行的時候,系統會建立一個進程,同時會分配一塊獨立的內存空間給該進程,這個內存空間在32位系統上是從0x00000000到0xFFFFFFFF, 4G的空間大小。

2. CPU時間分配的單位是線程,全部的函數都是在一個線程裏面執行的,當線程建立時,系統會分配一段內存和寄存器給這個線程,線程就能夠調用函數了。內存是在進程內存空間裏面。exe是一個文件的概念,只有當exe運行以後,系統建立的exe的進程實例以後,纔會分配內存,全部內存是在exe的進程實例中的,在exe以內的說法不妥。

3.自由存儲不是一個概念。通常而言,自由存儲是指CRT(C運行時庫)經過malloc,free函數管理的內存。特指經過new,delete管理的內存。可是在部分編譯器的實現上這兩塊內存都是同一種管理方式。

4. int* p = new int 如上述,在exe的進程空間內存空間裏面。

產生的時機如2所講,是在一個線程建立的時候。

 

在C++程序中內存是分爲5塊的,注意區分

1.

2.

3.自由存儲

4.全局/靜態存儲

5.文字常量存儲

相關文章
相關標籤/搜索