栈内存与堆内存的区别

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

一:程序的内存分配

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

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


二:申请后系统的响应

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

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


三:申请大小的限制

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

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


四:栈和堆的存储内容

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

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

JavaScript栈内存和堆内存区别

和栈这两个字我们已经接触多很多次,那么具体是什么存在栈中什么存在堆中呢?就拿JavaScript中的变量来说: 首先JavaScript中的变量分为基本类型和引用类型。 ...

java学习--栈内存和堆内存的区别

学了java很长时间了,但是对于堆栈的概念,一直模模糊糊,真正用起来

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

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

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

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

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

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

堆内存与栈内存的区别

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

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

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

静态内存,栈内存和堆内存的区别

程序的编译生成目标文件; 然后链接成可执行文件;然后程序进入宿主机执行。 #include "iostream" using namespace std; char* get_memory1() {...

学习笔记之堆内存和栈内存的区别

堆和栈的区别(内存和数据结构) 在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,堆栈是一个很模糊的概念。堆栈:一种数据结构、一个在程序运行时用于存...

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

在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。        当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:栈内存与堆内存的区别
举报原因:
原因补充:

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