轉自: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的進程空間棧內存空間裏面。
5 棧產生的時機如2所講,是在一個線程建立的時候。
在C++程序中內存是分爲5塊的,注意區分
1.棧
2.堆
3.自由存儲區
4.全局/靜態存儲區
5.文字常量存儲區