0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文看懂堆和栈的区别和联系

姚小熊27 来源:网络整理 2018-04-11 09:50 次阅读

堆和栈概要

在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。

堆和栈的要点

堆,队列优先,先进先出(FIFO—firstinfirstout)。

栈,先进后出(FILO—First-In/Last-Out)。

一般情况下,如果有人把堆栈合起来说,那它的意思是栈,可不是堆。

一文看懂堆和栈的区别和联系

堆和栈的对比分析

1、堆栈空间分配

栈(操作系统):由操作系统自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表

2、堆栈缓存方式

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

堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

3、堆栈数据结构区别

堆(数据结构):堆可以被看成是一棵树,如:堆排序。

栈(数据结构):一种先进后出的数据结构。

一文看懂堆和栈的区别和联系

堆和栈的联系

主函数先进栈,在栈中定义一个变量arr,接下来为arr赋值,但是右边不是一个具体值,是一个实体。实体创建在堆里,在堆里首先通过new关键字开辟一个空间,内存在存储数据的时候都是通过地址来体现的,地址是一块连续的二进制,然后给这个实体分配一个内存地址。数组都是有一个索引,数组这个实体在堆内存中产生之后每一个空间都会进行默认的初始化(这是堆内存的特点,未初始化的数据是不能用的,但在堆里是可以用的,因为初始化过了,但是在栈里没有),不同的类型初始化的值不一样。所以堆和栈里就创建了变量和实体:

一文看懂堆和栈的区别和联系

给堆分配了一个地址,把堆的地址赋给arr,arr就通过地址指向了数组。所以arr想操纵数组时,就通过地址,而不是直接把实体都赋给它。这种我们不再叫他基本数据类型,而叫引用数据类型。称为arr引用了堆内存当中的实体。(可以理解为c或c++的指针,Java成长自c++和c++很像,优化了c++)

如果当int[]arr=null;

arr不做任何指向,null的作用就是取消引用数据类型的指向。

当一个实体,没有引用数据类型指向的时候,它在堆内存中不会被释放,而被当做一个垃圾,在不定时的时间内自动回收,因为Java有一个自动回收机制,(而c++没有,需要程序员手动回收,如果不回收就越堆越多,直到撑满内存溢出,所以Java在内存管理上优于c++)。自动回收机制(程序)自动监测堆里是否有垃圾,如果有,就会自动的做垃圾回收的动作,但是什么时候收不一定。

所以堆与栈的区别很明显:

1.栈内存存储的是局部变量而堆内存存储的是实体;

2.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;

3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

堆与栈的主要区别

1、管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memoryleak。

2、空间大小:一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的栈空间大小是1M(好像是,记不清楚了)。当然,我们可以修改:

3、打开工程,依次操作菜单如下:Project-》Setting-》Link,在Category中选中Output,然后在Reserve中设定堆栈的最大值和commit。

注意:reserve最小值为4Byte;commit是保留在虚拟内存的页文件里面,它设置的较大会使栈开辟较大的值,可能增加内存的开销和启动时间。

4、碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出,详细的可以参考数据结构,这里我们就不再一一讨论了。

5、生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。

6、分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。

7、分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
收藏 人收藏

    评论

    相关推荐

    区别在哪

    以下引用网上资料 理解区别(1)区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的
    发表于 08-11 09:18

    C语言单片机、堆栈的区别是什么?

    C语言单片机、堆栈的区别是什么?
    发表于 10-13 08:09

    单片机中有什么区别

    M0中的空间的区别:(1)区(st
    发表于 11-22 06:23

    STM32中的区别是什么

    区别是什么?的空间是如何进行分配的?
    发表于 11-29 07:05

    区别是什么

    在回答完进程的虚拟地址空间布局之后(上篇),面试官可能抓住深入展开。区别①管理方
    发表于 12-22 07:26

    什么是?什么是

    在嵌入式编程中,个很重要的概念,不管是裸机编程还是基于RTOS编程。函数形参、局部变量、函数调用现场的保护及返回地址、中断函数执行前线程保护及中断嵌套的现场的保护都依赖于空间。
    发表于 12-22 06:09

    单片机区别在哪

    文末有图和程序帮助理解!!!区别可以用如下的比喻来看出:使用就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走不必理会切菜、洗菜等准备工作和洗碗、刷锅
    发表于 01-20 08:31

    明确区分,究竟有什么区别?

    这条短短的句话就包含了,看到new,我们首先就应该想到,我们分配了内存,那么指针p呢?他分配的是
    的头像 发表于 04-09 09:45 4392次阅读
    明确区分<b class='flag-5'>堆</b>与<b class='flag-5'>栈</b>,<b class='flag-5'>堆</b>和<b class='flag-5'>栈</b>究竟有什么<b class='flag-5'>区别</b>?

    如何分清区别(7大关键点)

    区别直都是永恒的话题,为此我也查了很多的资料,以防自己的理解错误,而给他人造成理解偏差。
    发表于 12-24 10:47 1.1w次阅读

    C语言内存的笔记资料说明

    本文档的主要内容详细介绍的是C语言内存的笔记资料说明说明了C语言中区别,哪些数据存放在
    发表于 02-14 08:00 3次下载
    C语言内存<b class='flag-5'>堆</b>与<b class='flag-5'>栈</b>的笔记资料说明

    理解区别(STM32)资料下载

    电子发烧友网为你提供理解区别(STM32)资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
    发表于 03-31 08:44 14次下载
    理解<b class='flag-5'>堆</b>和<b class='flag-5'>栈</b>的<b class='flag-5'>区别</b>(STM32)资料下载

    单片机中区别

    M0中的空间的区别:(1)区(st
    发表于 11-13 14:51 9次下载
    单片机中<b class='flag-5'>堆</b>和<b class='flag-5'>栈</b>的<b class='flag-5'>区别</b>

    的增长方向为什么通常是相反的?

    数据结构中,(heap)与(stack)是两个常见的数据结构,它们的存在都是为了优化内存,提高使用效率,各有特点,理解二者的定义、用法与区别,能够利用
    的头像 发表于 02-15 15:08 8552次阅读
    <b class='flag-5'>堆</b>和<b class='flag-5'>栈</b>的增长方向为什么通常是相反的?

    嵌入式C语言中区别

    在嵌入式C语言中,都是用来存储变量的内存区域,但它们在存储和使用变量方面有很大的区别
    的头像 发表于 04-14 11:45 1329次阅读

    区别和使用注意事项

    是在计算机科学中广泛使用的两种数据结构,它们具有不同的用途和特点。区别涉及到内存分配、访问方式、数据存储等方面。在使用
    的头像 发表于 01-18 17:24 2049次阅读