一个C程序在内存空间里面主要包括以下几个部分:
1,代码段
2,数据段
3,栈
4,堆
代码访问代码段,数据段放静态和全局变量,函数参数和局部变量放在堆栈里面,堆里面存是malloc分配的区域
堆栈里面是一个栈的结构,往里push东西的时候就小的数据就是向整形,浮点型这类基本的数据。但是stack有一个更大的单位,那就是stack frame,一个函数通常对应一个stack frame,在stack frame里面存放的依次是进入函数后执行的第一条指令地址,参数(一般是从右往左压入参数),局部变量。栈的分配方式又两种,一种是静态分配,编译器来分配。第二种是动态分配,调用malloca来进行分配,哲中动态分配的方式和heap的动态分配方式不太一样,在stack上分配的内存无须程序员自己回收。程序返回的时候,就回收了。
heap是动态分配的,理论上来讲heap的空间可以很大,大到沾满整个空间,他是C/C++库函数提供的接口,而不向stack那样是操作系统原生的,所以heap比stack慢一些,操作系统有专门的stack register。
stack是一块连续的区域,固定大小的,在编译时期确定,windows下默认的是2M,而heap是不连续的区域,当你new一个地址的时候,会去访问操作系统执行的一个free list,然后根据算法选定一块合适的区域然后分配的程序,记录到heap里面,会在这个端上记录大小,free的时候就可以根据地址来释放大小。
ffff
heap
----
stack
0000
heap增长方向是向着地址增长方向,stack是向着地址减小的方向
资料:
http://blog.csdn.net/rujielaisusan/article/details/4622197
http://blog.csdn.net/yeyuangen/article/details/6766567