堆和栈的区别

来源:互联网 发布:教育培训行业数据分析 编辑:程序博客网 时间:2024/06/15 20:48

对于许多新学C语言到同学,都会对堆栈一头雾水,我就一些文章简单总结下:

栈:后进先出;右边一起自动分配和释放,存放参数值、局部变量值;属于以及缓存,在函数调用时候分配空间,调用后立即释放。优势在于存取速度快。

栈的地址分配是向低地址扩展,是一块连续到区域,1M或2M大小,因此容易存在栈溢出。如果想存取较大到数组时候,尤其是二维数组,建议要用堆,而不用栈,太大时,很容易栈溢出。

栈的出入顺序,在函数调用时,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向函数的返回地址,也就是主函数中的下一条指令的地址,程序由该点继续运行。


堆:先进先出,又程序员分配和释放,如果不释放到话,程序结束后OS会回收,存储形式类似于链表。属于二级缓存,可动态分配大小(new 出来),用malloc分配。

堆到头部用一字节存堆大小。

堆的地址分配是向高地址扩展,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。容易产生内存碎片。


注:在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈,而是直接在进程的地址空间中保留一块内存,虽然用起来最不方便。但是速度快,也最灵活。


一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数名,局部变量的名等。其操作方式类似于数据结构中的栈。
2、堆区(heap)— 由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、静态区(static)—全局变量和局部静态变量的存储是放在一块的。程序结束后由系统释放。
4、文字常量区—常量字符串就是放在这里的,程序结束后由系统释放 。
5、程序代码区— 存放函数体的二进制代码。

0 0