栈内存与堆内存的区别

转载 2016年05月31日 19:52:34

一:程序的内存分配

    栈区(stack)有编译器自动分配释放,存放函数的参数,局部变量等.

    堆区(heap)一般由程序员分配和释放,否则就由OS回收。堆用于存放全局变量,静态变量,常量字符串和函数代码(函数体的二进制代码).


二:申请后系统的响应

       栈:只要栈的剩余空间大于所申请的空间,系统将为程序提供内存,否则将报异常提示栈溢出。

       堆:在记录空闲内存地址的链表中寻找一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。另外,对于大多数系统会在这块内存空间的首地址出记录本次分配空间的大小,这样代码中的delete 才能正确释放本内存空间。系统会将多余的那部分重新空闲链表中。


三:申请大小的限制

       栈:在windows中,栈是向低地址扩展的数据结构,是一块连续的内存区域。也就是栈顶的地址和栈的最大容量(windows2M)是系统规定好的。如果申请的空间超过剩余栈空间,将提示overflow,因此从栈获得的空间较小。

       堆:堆是向高地址扩展的数据结构,是不连续的内存区域。堆的大小受限于系统中有效的虚拟内存。由此可见堆的内存获得比较灵活,空间较大。


四:栈和堆的存储内容

       栈:在栈中,第一个进栈的是主函数下一条指令的地址,然后是函数的各个参数,在大多数编译器中,参数是由右往左入栈,然后是函数中的局部变量。注意,静态变量不入栈。出栈则刚好顺序相反。

       堆:一般在堆的头部用一个字节存放堆的大小,具体内容由程序员安排。

相关文章推荐

Java中堆内存和栈内存的区别

java中内存分为堆内存和栈内存。堆和栈都是数据结构,堆是一个完全的树结构,存储数组或者对象;栈是一个先进后出的栈,存储常量。   在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内...

java中堆内存和栈内存的区别。——2016.1.11

在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。        当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释...

java中堆内存和栈内存的区别

在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。        当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java...

java中堆内存(heap)和栈内存(stack)区别

前几天看了栈堆内存: 总结了下:有些是根据网上总结的(由于时间的问题,还没结完)     有错的地方希望提出 毕竟我也是新手 总结不好的地方不要拍砖!  Java code 栈内存:     在函数中...

堆内存与栈内存的区别

一、程序在编译的时候占用的内存分为以下几个部分: 1 、栈区( stack )— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。栈内存分配运算内置于...

Java中堆内存(heap)和栈内存(stack)的区别

对象在堆内存中,变量在栈内存中。方法结束后栈内存自动释放,但是堆内存不会自动释放。用收餐具举例子(公用餐具,一次性餐具) GC:垃圾回收  Gabbage Collection。Java中一般不需要...

堆内存与栈内存的区别

一、程序在编译的时候占用的内存分为以下几个部分: 1 、栈区( stack )— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。栈内存分配运算内置于...

深夜聊一波栈内存和堆内存的区别

先总结一下:1 栈:为编译器自动分配和释放,如函数参数、局部变量、临时变量等等2 堆:为成员分配和释放,由程序员自己申请、自己释放。否则发生内存泄露。典型为使用new申请的堆内容。除了这两部分,还有一...

栈内存与堆内存的区别

一:程序的内存分配    栈区(stack)有编译器自动分配释放,存放函数的参数,局部变量等.    堆区(heap)一般由程序员分配和释放,否则就由OS回收。堆用于存放全局变量,静态变量,常量字符串...

堆内存和栈内存的区别

一、程序在编译的时候占用的内存分为以下几个部分:  1 、栈区( stack )— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。栈内存分配运算内置于...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)