heap和stack区别

heap和stack区别所以在分配和销毁时都要占用时间 因此用堆的效率非常低 但是堆的优点在于 编译器不必知道从堆里分配多少存储空间 也不必知道存储的 数据要在堆里停留多长时间 因此 用堆保存数据时会得到更大的灵活性 事实上 面向对象的多态性 堆内存分配是必不可少的 而堆不属于程序 堆是独立的 是公用的 只要你 mallic sizeof size 就可以得到相应一部分的堆空间 stack 的空间是由操作系统自动分配和释放 存放函数的参数值 局部变量的值 操作方式类似于数据结构中的栈 1 stack 栈 heap 堆

1.stack:栈 heap:堆

2.空间分配问题:

stack的空间是由操作系统自动分配和释放,存放函数的参数值,局部变量的值,操作方式类似于数据结构中的栈;

heap:一般是程序员分配释放,空间是手动申请和释放的,heap常用new关键字来分配;

stack空间有限,heap的空间是很大的自由区。在Java中,若只是声明一个对象,则先在栈内存中为其分配地址空间,若再new一下,实例化它,则在堆内存中为其分配地址。

3.缓存方式的区别:

栈使用的是一级缓存,通常都是被调用时处于存储空间中,调用完毕立即释放;

堆是存放在二级缓存中,生命周期是由虚拟机的垃圾回收算法来决定的;

4.数据结构的区别:

 堆(数据结构):堆可以被看成是一颗树,如:堆排序 ​ 栈(数据结构):一种先进后出的数据结构 复制代码

5.举例:

       int a;//此时a在栈区   数据类型 变量名;这样定义的东西在栈区。 ​       object a=null;//只在栈内存中分配空间 ​       new 数据类型(); 或者malloc(长度);//定义的东西在堆区 ​       object b=new object();//则在堆内存中分配空间 复制代码

6.堆主要是用来存放对象的,栈主要是用来执行程序的,这种主要是由堆和栈的特点决定的;

     (1).C/C++中,所有的方法调用都是通过栈来进行的,所有的局部变量都是从栈中分配内存的,注意:在分配的时候, ​   比如为一个即将要调用的程序模块分配数据区时,应事先知道这个数据区的大小,就是虽然分配是在程序运行时进行的, ​   但是分配的大小多少是确定不变的,这个“大小多少”是在编译时就确定的,不是在运行时。 复制代码

(2).堆是应用程序在运行的时候请求操作系统分配给自己内存,由于从操作系统管理的内存分配,由于从操作系统管理的内存分配,

所以在分配和销毁时都要占用时间,因此用堆的效率非常低,但是堆的优点在于,编译器不必知道从堆里分配多少存储空间,也不必知道存储的

数据要在堆里停留多长时间,因此,用堆保存数据时会得到更大的灵活性,事实上,面向对象的多态性,堆内存分配是必不可少的,

因为多态变量所需的存储空间只有在运行时创建了对象后才能确定,C++中,创建一个对象,使用new即可,执行这些代码时,会在堆里自动

进行数据的保存,当然,这会花费更长时间,导致效率低。

7.其它区别:

堆是不同于栈的另一部分区域,系统会给每个程序分配一部分栈空间让他们能够运作起来,问题是栈空间必然存在不够用的问题,

而堆不属于程序,堆是独立的,是公用的,只要你mallic(sizeof(size),就可以得到相应一部分的堆空间。

8.一些问题:

Q:有栈,为什么用堆? ​ A: 堆里面的东西有生命周期,即变量作用域,你在函数内部创建一个变量, 函数调用结束这个变量就没了,而堆里面的东西独立于你的程序, ​     malloc()后,除非free()掉,否则一直存在。 ​ Q: 为什么用堆少? ​ A:麻烦 ​ Q:有什么需要注意的? ​ A:堆里面申请的东西,是随机分配的,不像栈里面的地址都已经计算出来了, 所以申请了堆空间之后一定要创建一个指针保存你所 ​     申请的堆空间的地址,不然就找不到你申请的空间了。 ​     既然涉及到指针,请注意用之前检查一下指针是否为空的问题。 ​   堆空间的东西申请好,在用完之后一定要free()掉,以防止堆溢出。 复制代码

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199977.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午11:47
下一篇 2026年3月20日 上午11:48


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号