堆和栈的区别 曾经终败给现在 2023-09-27 21:59 4阅读 0赞 **栈是运行时的单位,而堆是存储的单位。** 栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据 怎么放、放在哪儿。 在Java中一个线程就会相应有一个线程栈与之对应,这点很容易理解,因为不同的线程执行逻辑有所不 同,因此需要一个独立的线程栈。而堆则是所有线程共享的。栈因为是运行单位,因此里面存储的信息 都是跟当前线程(或程序)相关信息的。包括局部变量、程序运行状态、方法返回值等等;而堆只负责 存储对象信息。 **为什么要把堆和栈区分出来呢?栈中不是也可以存储数据** **吗?** 1. 从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰。 分而治之的思想。这种隔离、模块化的思想在软件设计的方方面面都有体现。 2. 堆与栈的分离,使得堆中的内容可以被多个栈共享(也可以理解为多个线程访问同一个对象)。这 种共享的收益是很多的。一方面这种共享提供了一种有效的数据交互方式(如:共享内存),另一方 面,堆中的共享常量和缓存可以被所有栈访问,节省了空间。 3. 栈因为运行时的需要,比如保存系统运行的上下文,需要进行地址段的划分。由于栈只能向上增 长,因此就会限制住栈存储内容的能力。而堆不同,堆中的对象是可以根据需要动态增长的,因此 栈和堆的拆分,使得动态增长成为可能,相应栈中只需记录堆中的一个地址即可。 4. 面向对象就是堆和栈的完美结合。其实,面向对象方式的程序与以前结构化的程序在执行上没有任 何区别。但是,面向对象的引入,使得对待问题的思考方式发生了改变,而更接近于自然方式的思 考。当我们把对象拆开,你会发现,对象的属性其实就是数据,存放在堆中;而对象的行为(方 法),就是运行逻辑,放在栈中。我们在编写对象的时候,其实即编写了数据结构,也编写的处理 数据的逻辑。不得不承认,面向对象的设计,确实很美。 **为什么不把基本类型放堆中呢?** 因为其占用的空间一般是1~8个字节——需要空间比较少,而且因为是基本类型,所以不会出现动态增 长的情况——长度固定,因此栈中存储就够了,如果把他存在堆中是没有什么意义的(还会浪费空间, 后面说明)。可以这么说,基本类型和对象的引用都是存放在栈中,而且都是几个字节的一个数,因此 在程序运行时,他们的处理方式是统一的。但是基本类型、对象引用和对象本身就有所区别了,因为一 个是栈中的数据一个是堆中的数据。最常见的一个问题就是,Java中参数传递时的问题。 **堆中存什么?栈中存什么?** 堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用。一个对象的大小是不可估计的,或者说 是可以动态变化的,但是在栈中,一个对象只对应了一个4btye的引用(堆栈分离的好处:))。 为什么不把基本类型放堆中呢?因为其占用的空间一般是1~8个字节——需要空间比较少,而且因为是 基本类型,所以不会出现动态增长的情况——长度固定,因此栈中存储就够了,如果把他存在堆中是没 有什么意义的(还会浪费空间,后面说明)。可以这么说,基本类型和对象的引用都是存放在栈中,而 且都是几个字节的一个数,因此在程序运行时,他们的处理方式是统一的。但是基本类型、对象引用和对象本身就有所区别了,因为一个是栈中的数据一个是堆中的数据。最常见的一个问题就是,Java中参 数传递时的问题。
相关 堆和栈的区别 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放 迷南。/ 2022年08月20日 12:13/ 0 赞/ 203 阅读
相关 堆和栈的区别 一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参 Dear 丶/ 2022年07月18日 00:24/ 0 赞/ 43 阅读
相关 堆和栈的区别 堆栈控件分配 栈(操作系统):由操作系统自动释放,存放函数的参数值,局部变量的值。其操作方式类似于数据结构中的栈。 堆(操作系统):一般由程序员分配释放,若程序员不释放 素颜马尾好姑娘i/ 2022年06月12日 20:57/ 0 赞/ 295 阅读
相关 堆和栈的区别 转载自:http://blog.csdn.net/hairetz/article/details/4141043 一、预备知识—程序的内存分配 一个由C/C++编 Love The Way You Lie/ 2022年06月02日 07:50/ 0 赞/ 264 阅读
相关 堆和栈的区别 原博地址:https://blog.csdn.net/qq\_35923749/article/details/79517397 https://blog.csdn.ne 你的名字/ 2022年05月20日 06:58/ 0 赞/ 537 阅读
相关 堆和栈的区别 在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分: Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空 逃离我推掉我的手/ 2022年05月14日 02:52/ 0 赞/ 287 阅读
相关 堆和栈的区别 The differences between the stack and the heap can be confusing for many people. So, we 分手后的思念是犯贱/ 2022年05月13日 00:04/ 0 赞/ 123 阅读
相关 栈和堆的区别 说起会了解这个东西,还是比较尴尬的,在学校里面老师一般不会讲解C++的堆和栈,大多数人了解的堆和栈是数据结构里面的概念,而这里一般面试官想问的是C++的内存分区管理方式。 首 蔚落/ 2022年03月25日 01:52/ 0 赞/ 336 阅读
相关 堆和栈的区别 [2019独角兽企业重金招聘Python工程师标准>>> ][2019_Python_] ![hot3.png][] 一、预备知识——程序的内存分配 一个由C/C++编译的程 落日映苍穹つ/ 2022年01月14日 09:51/ 0 赞/ 391 阅读
相关 堆和栈的区别 栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。 堆是程序运行期间动态分配的内存空间,你可以根据程序的运行 ╰半夏微凉°/ 2021年12月21日 14:25/ 0 赞/ 350 阅读
还没有评论,来说两句吧...