堆和栈

18 篇文章 1 订阅

堆和栈的区别:作为开发人员,面对堆和栈这两个概念时,在不同的情况下,有不同的含义。一般情况下,有这两种含义:
1)在内讲,作为内存的管理方式。
2)在数据结构下,堆和栈作为两种常用的数据结构。

栈简介:

栈由操作系统分配,用来存储局部变量,函数参数等,其操作方式类似与操作系统中的栈。变量根据先后顺序压入栈中,并且相邻的变量之间不会有其他变量,栈的地址由高到低,后定义的变量地址小于先定义的变量地址,与堆的形式正好相反。栈中的数据周期随着函数的结束而结束。

堆简介:

堆上的内存空间由开发人员自己分配内存并释放。程序结束时才会自动释放。如果程序员不及时释放堆上内存,当程序量执行到一定程度,会造成内存泄露。堆上大的内存地址不存在先后关系,因为动态开辟内存并不是连续内存空间。堆上的数据未释放,其生命周期是程序的生命周期。

堆栈其实是操作系统对进程占用空间的内存管理方式,主要区别
1)管理方式不同:堆上内存手动释放;栈上的内存系统自动释放。
2)大小不同。每个进程需要的栈内存空间大小远远小于堆的空间大小。堆认为可以开辟的内存大小未虚拟内存,而在64位操作上面,windows上面栈的内存大小为1M,Linux上面栈的大小为10M。
3)内存开辟的形式不同。栈的开辟是由高地址向低地址开辟。而堆上的内存是由低地址向高地址开辟。
4)分配方式不同。堆上的内存是动态开辟的,而栈上的内存既可以动态开辟,也可以静态开辟比如局部变量,但都是系统释放。
5)分配效率不同,对于栈上分配的内存有操作系统完成,因此在底层硬件会支持栈的开销,有专门的指令来控制栈的开辟和释放,6因此栈的效率较高,而堆上的内存由库函调用开辟,过程复杂较慢。
6)存放内容不同。栈存放的内容,函数返回地址、相关参数、局部变量和寄存器内容等。当主函数调用另外一个函数的时候,要对当前函数执行断点进行保存,需要使用栈来实现,首先入栈的是主函数下一条语句的地址,即扩展指针寄存器的内存(eip),然后是当前栈帧的底部地址,即扩展基址指针寄存器内容(ebp),再然后是被调函数的实参等,一般情况下是按照从右向左的顺序入栈,之后是调用函数的局部变量,注意静态变量是存放在数据段或者BSS段,是不入栈的。出栈的顺序正好相反,最终栈顶指向主函数下一条语句的地址,主程序又从该地址开始执行。堆,一般情况堆顶使用一个字节的空间来存放堆的大小,而堆中具体存放内容是由程序员来填充的。从以上可以看到,堆和栈相比,由于大量malloc()/free()或new/delete的使用,容易造成大量的内存碎片,并且可能引发用户态和核心态的切换,效率较低。栈相比于堆,在程序中应用较为广泛,最常见的是函数的调用过程由栈来实现,函数返回地址、EBP、实参和局部变量都采用栈的方式存放。虽然栈有众多的好处,但是由于和堆相比不是那么灵活,有时候分配大量的内存空间,主要还是用堆。无论是堆还是栈,在内存使用时都要防止非法越界,越界导致的非法内存访问可能会摧毁程序的堆、栈数据,轻则导致程序运行处于不确定状态,获取不到预期结果,重则导致程序异常崩溃,这些都是我们编程时与内存打交道时应该注意的问题。

2.数据结构上的堆和栈:这是两种常见的数据结构

2.1栈是一种运算受限的线性表,其限制是指只仅允许在表的一端进行插入和删除操作,这一端被称为栈顶(Top),相对地,把另一端称为栈底(Bottom)。把新元素放到栈顶元素的上面,使之成为新的栈顶元素称作进栈、入栈或压栈(Push);把栈顶元素删除,使其相邻的元素成为新的栈顶元素称作出栈或退栈(Pop)。这种受限的运算使栈拥有“先进后出”的特性(First In Last Out),简称FILO。栈分顺序栈和链式栈两种。栈是一种线性结构,所以可以使用数组或链表(单向链表、双向链表或循环链表)作为底层数据结构。使用数组实现的栈叫做顺序栈,使用链表实现的栈叫做链式栈,二者的区别是顺序栈中的元素地址连续,链式栈中的元素地址不连续。
2.2堆是一种常用的树形结构,是一种特殊的完全二叉树,当且仅当满足所有节点的值总是不大于或不小于其父节点的值的完全二叉树被称之为堆。堆的这一特性称之为堆序性。因此,在一个堆中,根节点是最大(或最小)节点。如果根节点最小,称之为小顶堆(或小根堆),如果根节点最大,称之为大顶堆(或大根堆)。堆的左右孩子没有大小的顺序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值