堆和栈的区别 快来打我* 2023-10-13 14:54 12阅读 0赞 #### 栈与堆 #### * 栈的特点和使用 * 堆的出现和特点 * 共同点 * 区别 * * 占用空间大小的区别 * 访问效率的区别 * 访问权限的区别 * * 栈对应到函数(线程)上 * 堆对应到进程上 * 存放的内容不同 * * 栈中存储的内容 * 堆中存储的内容 * 使用堆和栈的不同情况 ## 栈的特点和使用 ## 栈是连续内存地址,内存创建寻址效率都很高。 ![在这里插入图片描述][5f5b9821c88f473eb319656e18504056.png] 函数调用栈遵循着先入后出的原则。 ![在这里插入图片描述][bcc35a6b9e854e8f989f1ec0aac9c8aa.png] 最后调用的函数最先释放栈内存。 函数参数传递是赋值传递,即将实参复制一份给形参,因而形参的改变不会影响实参。但是如果参数是指针,那么复制的就是地址的值。我们把包括结构体在内的基础类型的传参称为值传递。而指针的传递称为引用传递。像c golang等是有指针和地址概念的。而对于java python js等语言,对象的变量名本身就是一个指针,因而传递对象就是引用传递。 ## 堆的出现和特点 ## 对于返回值,父函数在子函数入栈之前会留出返回值的内存空间,返回值和入参一样是复制传递。但是返回值如果是指针,则可能会导致父函数调用该地址内的变量的时候,子函数因为已经出栈,而导致访问错误。 同样的情况也会出现在全局变量属性的赋值的时候,这些都属于变量逃逸。 很多语言像go rust java等,会自动的进行逃逸分析,将逃逸的变量创建到所有函数共享的全局空间中。那这就是堆。 堆内存的释放比较复杂,像C语言需要手动释放,忘记或者多次释放都会带来问题。 而像java golang js python等等是有gc机制的。它能够定期的自动释放。但是这也会导致性能下降,尤其是无法胜任硬件编程和系统级别的编程。 但在web应用这种容忍性较高的场景却有着广泛的应用。 rest则是提出了自动实时回收的机制。但是需要有严格的编程规范。 ![在这里插入图片描述][198b0a10761b476c861a2875db04d02a.png] ## 共同点 ## 堆和栈是程序中最重要的两种内存形式。堆和栈的空间都是在内存上面的。 ## 区别 ## ### 占用空间大小的区别 ### 堆是一个动态的概念。栈是一个静态的概念。栈是在编译的时候确定的。堆是在运行的时候确定的。栈的大小在编译的时候是定好了的,堆这一块是动态变化的概念。堆的大小主要取决于那一刻程序运行的那一刻的数据。所以根据不同的需求,你可能选择堆或者栈。 ### 访问效率的区别 ### 因为堆是动态,栈是静态,所以堆的速度要慢。 ### 访问权限的区别 ### #### 栈对应到函数(线程)上 #### 一个函数调用,里面的数据都是在栈上的。这个函数调用,它里面的数据是无法被另一个函数访问的。不同函数之间的栈数据不能共享。 同样的,这个原则也适用于多线程,每个线程的调用,你启动一个线程的时候,实际上是调用一个函数。它会有各自的栈。线程之间的栈数据也是不能共享的。 #### 堆对应到进程上 #### 堆是在这个进程上的,只要在这个应用内,所有的线程都可以访问这个堆上的数据。 不同的语言处理堆上的数据不同,有的是用gc,有的是需要你自己去释放,像c和c++用free malloc去做这些事情。有的需要把它设成null,才能把它的reference counter设成0,gc才能把它释放掉。 ### 存放的内容不同 ### #### 栈中存储的内容 #### 1. 基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new出来的对象)或者常量池中(字符串常量对象存放的常量池中)。 2. 局部变量,但方法中的局部变量使用final修饰后,放在堆中,而不是栈中。 #### 堆中存储的内容 #### 1. 存放使用new创建的对象 2. 全局变量 ## 使用堆和栈的不同情况 ## size不确定,可能用堆。确定的话,因为效率的问题,肯定用栈,栈能极大程度提高你的运行速度。 当你想要使用非常庞大的内存的时候,一般不去用栈,一般是用堆,因为需要用完后赶紧释放掉。 **参考资料**: 1. [【120秒】栈与堆][120] 2. [堆和栈的区别是什么?][Link 1] 3. [堆和栈存放的内容][Link 2] [5f5b9821c88f473eb319656e18504056.png]: https://img-blog.csdnimg.cn/5f5b9821c88f473eb319656e18504056.png [bcc35a6b9e854e8f989f1ec0aac9c8aa.png]: https://img-blog.csdnimg.cn/bcc35a6b9e854e8f989f1ec0aac9c8aa.png [198b0a10761b476c861a2875db04d02a.png]: https://img-blog.csdnimg.cn/198b0a10761b476c861a2875db04d02a.png [120]: https://www.bilibili.com/video/BV1GL4y1T7wr/?spm_id_from=333.337.search-card.all.click&vd_source=a1af903e57688df870625021f7f3a7eb [Link 1]: https://www.bilibili.com/video/BV1xK4y1b7HQ/?spm_id_from=333.337.search-card.all.click&vd_source=a1af903e57688df870625021f7f3a7eb [Link 2]: https://blog.csdn.net/weixin_41707929/article/details/101275474
相关 堆和栈的区别 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放 迷南。/ 2022年08月20日 12:13/ 0 赞/ 202 阅读
相关 堆和栈的区别 一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参 Dear 丶/ 2022年07月18日 00:24/ 0 赞/ 42 阅读
相关 堆和栈的区别 堆栈控件分配 栈(操作系统):由操作系统自动释放,存放函数的参数值,局部变量的值。其操作方式类似于数据结构中的栈。 堆(操作系统):一般由程序员分配释放,若程序员不释放 素颜马尾好姑娘i/ 2022年06月12日 20:57/ 0 赞/ 293 阅读
相关 堆和栈的区别 转载自:http://blog.csdn.net/hairetz/article/details/4141043 一、预备知识—程序的内存分配 一个由C/C++编 Love The Way You Lie/ 2022年06月02日 07:50/ 0 赞/ 263 阅读
相关 堆和栈的区别 原博地址:https://blog.csdn.net/qq\_35923749/article/details/79517397 https://blog.csdn.ne 你的名字/ 2022年05月20日 06:58/ 0 赞/ 536 阅读
相关 堆和栈的区别 在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分: Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空 逃离我推掉我的手/ 2022年05月14日 02:52/ 0 赞/ 286 阅读
相关 堆和栈的区别 The differences between the stack and the heap can be confusing for many people. So, we 分手后的思念是犯贱/ 2022年05月13日 00:04/ 0 赞/ 121 阅读
相关 栈和堆的区别 说起会了解这个东西,还是比较尴尬的,在学校里面老师一般不会讲解C++的堆和栈,大多数人了解的堆和栈是数据结构里面的概念,而这里一般面试官想问的是C++的内存分区管理方式。 首 蔚落/ 2022年03月25日 01:52/ 0 赞/ 336 阅读
相关 堆和栈的区别 [2019独角兽企业重金招聘Python工程师标准>>> ][2019_Python_] ![hot3.png][] 一、预备知识——程序的内存分配 一个由C/C++编译的程 落日映苍穹つ/ 2022年01月14日 09:51/ 0 赞/ 387 阅读
相关 堆和栈的区别 栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。 堆是程序运行期间动态分配的内存空间,你可以根据程序的运行 ╰半夏微凉°/ 2021年12月21日 14:25/ 0 赞/ 347 阅读
还没有评论,来说两句吧...