堆(heap)和栈(Stack)的区别是什么?为什么平时都把堆栈放在一起讲?
发布网友
发布时间:2022-03-28 10:33
我来回答
共4个回答
热心网友
时间:2022-03-28 12:02
将堆跟栈放在一起将是因为两者都是存储数据的方式。区别如下:
一、主体不同
1、堆:是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树的数组对象。
2、栈:又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。
二、特点不同
1、堆:堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。
2、栈:是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶。
三、作用不同
1、堆:堆是非线性数据结构,相当于一维数组,有两个直接后继。
2、栈:可以用来在函数调用的时候存储断点,做递归时要用到栈。
参考资料来源:百度百科-堆
参考资料来源:百度百科-栈
热心网友
时间:2022-03-28 13:20
1、堆、堆栈、栈
堆和栈都和编译、编程有关。但很多老师在讲具体的程序设计语言时,重点在语法。将它们跳过,或简单地称其为堆栈。堆栈是内存的逻辑层面的东西。在谈论上层应用时,经常忽略它们。久而久之就出现了“堆栈”这个混乱的术语。但这个术语已经存在,大多数人提到堆栈时,意思是“栈”,所以它成为约定俗成,那么你只能接受。堆是heap。栈是stack。堆栈就是栈。
2、进程、线程 与 堆、栈
现在是多任务系统。每个进程是资源(不含处理器资源)分配的基本单位。每个进程含若干线程。线程是调度执行的基本单位。同一个进程的多个线程可以共享所属进程的资源。程序员可以进行同步控制(多线程编程)。
每个进程有一个或几个堆。这要看不同的OS了。程序员要在堆中分配/释放空间,需要malloc free这样的显式操作。java中的new操作,建立对象,其实也间接执行了malloc这样的操作。对象的回收其实也要执行free。不过是包装了一下而已。
每个线程有一个私有资源,那就是栈。函数调用时,要把返回地址和参数入栈。被调函数执行时,要把参数取出来,赋给形参。被调函数执行完后还要把返回地址取出来,跳回去。栈是自动实现的,不需要程序员干预。(因为编译器实现了)。局部变量也位于栈。
3、内存管理分页机制
Windows / Linux采用段页式。但这只是内存管理方法。跟堆栈是两回事啊。并不矛盾。
热心网友
时间:2022-03-28 14:55
堆栈 = 栈 = Stack
用malloc(),free()分配的就叫堆
热心网友
时间:2022-03-28 16:46
程序的运行场所是内存,栈和堆是进程的虚拟内存中的两部分区域。
当程序被执行时,程序代码,你所创建的变量、常量等都会被压入栈空间里,栈是程序代码的执行区域。栈的内存地址是连续的且被一一记录,所以说当你创建了一个变量(比如int var = 1),我们就可以通过var这个变量来访问变量的内容。在这里,var就存放在栈中,它的地址已经默认被编译器计算好了,调用过程也不需要你涉及到有关地址的操作。更直观的感受是数组,数组里的元素在栈里面是连续排放的,相邻两个元素的地址相差1。
而堆是不同于栈的另一部分区域,系统会给每个程序分配一部分栈空间让他们能够运行起来,问题就是栈空间必然存在不够用的问题,而堆不属于程序,堆是独立的,是公用的。只要你malloc(sizeof(SIZE_YOU_WANT)),就可以得到相应一部分的堆空间。
有栈,为什么用堆?
::栈里面的东西有生命周期,说俗点就是变量作用域,你在函数内部创建一个变量,函数调用结束这个变量就没了。而堆里面的东西独立于你的程序,malloc()之后,除非你free()掉,否则一直存在。
为什么用堆少?
::麻烦!
有什么要注意?
::堆里面申请的东西,是随机分配的,不像栈里面的地址都已经计算好了。所以申请了堆空间之后一定要创建一个指针保存你说申请到的堆空间的地址。不然就找不到你申请的空间了。
既然涉及到指针,请注意用之前检查一下指针空不空的问题。
堆空间的东西申请好,在用完之后一定要free()掉,以防止堆溢出。
说到安全性,还真是挺麻烦的。(纯手打)
堆(heap)和栈(Stack)的区别是什么?为什么平时都把堆栈放在一起讲?
一、主体不同 1、堆:是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树的数组对象。2、栈:又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。二、特点不同 1、堆:堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全...
堆(heap)和栈(Stack)的区别是什么?为什么平时都把堆栈放在一起讲?
1、栈使用的是一级缓存,通常都是被调用时处于存储空间中,调用完毕立即释放;2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。三、堆栈数据结构区别:堆(数据结构):堆可以被看成是一棵树,如:堆排...
堆和栈(Heap and Stack)的区别!
堆(Heap):堆(Heap)是动态分配的,你可以在任意时间自由分配!使用起来肯定比栈(Stack)复杂,但是也给了我们灵活性!操作系统在线程建立时会自动为系统级线程分配Stack,而Heap的分配是由程序运行时调用系统完成的!Stack的速度比Heap要快的多!Image source: vikashazrati.wordpress.com ...
C语言中内存堆和栈的区别
堆(heap)和栈(stack)原本是两种不同的数据结构,在C语言内存表述中,代表着用这两种数据结构管理的两种内存块。堆由整个系统共享,各个进程拥有同一个堆。 栈由每个进程自行管理,也就是每个进程的栈是独立的,互不相关。具体区别如下:一、栈上的内存由系统自动管理分配,用于存储局部变量。 堆中的内...
为什么要用堆栈,什么是堆栈
堆(heap)和栈(stack)有什么区别??简单的可以理解为:heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(...
堆栈与堆(Stack vs Heap):有什么区别?图文并茂拆解代码解析!
堆栈:适合临时存储,数据访问受限,适合生命周期短或局部的数据。它的自动管理确保了代码的简洁和高效。 堆:灵活性强,能容纳大对象,但需要程序员手动管理,可能导致性能瓶颈。它的存在是为了支持跨函数的数据共享和动态对象的生命周期。 正确选择内存类型,就像导演在布景和演员间巧妙调度,是提升...
java虚拟机内存中,heap和stack有什么区别
堆中的变量大小与exe大小关系不大,但分配和释放需要耗费的时间远大于stack中分配内存所需的时间。2.在Java语言里堆(heap)和栈(stack)里的区别1). 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 2). 栈的优势是,存取速度比堆要快,...
堆栈和栈的区别
两种内存在内存分配方式和内存管理方式有区别。内存分配方式栈(stack)和堆(heap)都是内存中的一段区域,内存分配方式是不同的,栈是由程序自动创建和释放的,用于存储函数调用时的临时变量、函数的返回地址等信息;堆是由程序员手动申请和释放的,用于存储程序中需要动态分配的内存(如动态数组、对象等...
js堆和栈的区别
一、堆(heap)和栈(stack)栈(stack)会自动分配内存空间,会自动释放。堆(heap)动态分配的内存,大小不定也不会自动释放。二、基本类型和引用类型 基本类型:简单的数据段,存放在栈内存中,占据固定大小的空间。引用类型:指那些可能由多个值构成的对象,保存在堆内存中,包含引用类型的变量实际上保存的...
堆和栈的区别
1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据在多个线程或者多个栈之间...