转自: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.文字常量存储区