毫无疑问,显然从栈上分配内存更快,因为从栈上分配内存仅仅就是栈指针的移动而已

操作系统会在底层对栈提供支持,会分配专门的寄存器存放栈的地址,栈的入栈出栈操作也十分简单,并且有专门的指令执行,所以栈的效率比较高也比较快。而堆的操作是由C/C++函数库提供的,在分配堆内存的时候需要一定的算法寻找合适大小的内存。并且获取堆的内容需要两次访问,第一次访问指针,第二次根据指针保存的地址访问内存,因此堆比较慢。在堆区上申请与释放内存是一个相对复杂的过程,因为堆本身是需要程序员(内存分配器实现者)自己管理的,而栈是编译器来维护的,堆区的维护同样涉及内存的分配与释放,但这里的内存分配与释放显然不会像栈区那样简单,一句话,这里是按需进行内存的分配与释放本质在于堆区中每一块被分配出去的内存其生命周期都不一样,这是由程序员决定的,我倾向于把内存动态分配释放想象成去停车场找停车位。

? 堆和栈有什么区别

  • 从定义上:堆是由new和malloc开辟的一块内存,由程序员手动管理,栈是编译器自动管理的内存,存放函数的参数和局部变量。
  • 堆空间因为会有频繁的分配释放操作,会产生内存碎片
  • 堆的生长空间向上,地址越来越大,栈的生长空间向下,地址越来越小
  • 堆的内容是程序员自己提供,并维护,在堆上申请空间用完需要释放掉,防止内存泄漏
  • 分配栈空间,如果剩余空间大于申请空间则分配成功,否则分配失败栈溢出;申请堆空间,堆在内存中呈现的方式类似于链表(记录空闲地址空间的链表),在链表上寻找第一个大于申请空间的节点分配给程序,将该节点从链表中删除,大多数系统中该块空间的首地址存放的是本次分配空间的大小,便于释放,将该块空间上的剩余空间再次连接在空闲链表上。

堆与栈区别,以及分配内存的快慢相关推荐

  1. 内存区划分;内存分配;堆、栈概念分析;动态内存管理数据结构及程序样例;核心态与用户态...

    一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放 2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初 ...

  2. 1.1JVM内存结构——堆、栈、方法区、直接内存、堆和栈区别

    一.定义 1.堆:FIFO队列优先,先进先出.jvm只有一个堆区被所有线程所共享!堆存放在二级缓存中,调用对象的速度相对慢一些,生命周期由虚拟机的垃圾回收机制定. 2.栈:FILO先进后出,暂存数据的 ...

  3. 堆、栈、方法区、直接内存、堆和栈区别

    JVM的体系结构 (1) Class Loader类加载器        负责加载 .class文件,class文件在文件开头有特定的文件标示,并且ClassLoader负责class文件的加载等,至 ...

  4. 计算机基础(五):堆和栈区别

    一.堆和栈的主 要区别 1.管理方式不同: 2.空间大小不同: 3.能否产生碎片不同: 4.生长方向不同: 5.分配方式不同: 6.分配效率不同: 管理方式:对于栈来讲,是由编译器自动管理,无需我们手 ...

  5. 堆和栈区别 java_JAVA中堆和栈的区别

    在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配 ...

  6. 堆和栈区别 java_Java中的堆和栈以及堆栈的区别

    在正式内容开始之前要说明一点,我们经常所说的堆栈堆栈是堆和栈统称,堆是堆,栈是栈,合在一起统称堆栈; 堆主要用来存放对象,栈用来执行程序.dnf自动收货工具的原理就是一个程序比如自动收货,先设置收的东 ...

  7. php 堆内存和栈内存,内存分配堆与栈的区别

    堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义.一般情况下,有两层含义: (1)程序内存布局场景下,堆与栈 ...

  8. 堆和栈的区别 之 数据结构和内存

    版权归作者所有,仅供学习. 数据结构的栈和堆 首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈. 堆和栈都是一种数据项按序排列的数据结构. 栈就像装数据的桶或箱子 我 ...

  9. java面试 内存中堆和栈的区别

    java中的内存,分为两种,一为堆内存,二为栈内存. 栈内存 在函数中定义的基本类型的变量和对象的引用变量都是在函数的栈内存中分配. 当在一段代码块中声明了一个变量时,java就会在栈内存中为这个变量 ...

最新文章

  1. H3C S6800交换机基本配置命令
  2. 2020\Simulation_1\3.叶节点数
  3. JavaScript对象的chapterI
  4. 相对完善的Java通过JDBC操纵mysql的例子
  5. 利用浏览器调试功能 计算 百度网盘 文件数量 V2
  6. JAVA第三方包导入但找不到类,解决:导入第三方包报错java.lang.NoClassDefFoundError:XXX.XXX,XXXXXX...
  7. 什么是web前端?Web前端好入门吗?
  8. 【前沿方案】华为自动驾驶网络解决方案.pdf(附80页pdf下载链接)
  9. AI在中国,还没到抢切蛋糕的时候
  10. hive 日期函数_数据分析面试必备——SQL窗口函数你会了吗?
  11. Windows系统安装运行库
  12. STM8L超低功耗程序编写教学,简单易懂
  13. 声艺数字调音台si说明书32路_声艺Si Expression 3 32路数字调音台
  14. 自动刷抖音脚本(解放你的双手)
  15. mysql排序之if(isnull(字段名),0,1),fild 或者 if(isnull(字段名),1,0),fild
  16. 九度oj 题目1029:魔咒词典
  17. PAT 1038 贪心
  18. flashfxp怎么传文件,小编教你flashfxp怎么传文件
  19. 微信小程序自动检测新版本并静默更新,及热启动和冷启动
  20. 《毒液2》上线,豆瓣评分6.1-附繁体中字预告片

热门文章

  1. 在Mysql中无符号是什么意思博客_mysql中的unsigned是什么意思???
  2. R时间序列分析|SP500股指的ARIMA模型预测与残差ARCH效应分析
  3. Java基础 println print 实现输出换行
  4. GridView动态添加列并判断绑定数据DataTable的列类型控制展示内容
  5. Dfinity(ICP)基础开发教程-5
  6. Android手机投屏初探
  7. 华为手机忘记密码如何解开,有什么相关教程吗
  8. 本地虚拟机搭建nginx web服务器
  9. Stetman读paper小记:BackdoorBench - A Comprehensive Benchmark of Backdoor Learning
  10. 【语音智能平台】京东Alpha VS 讯飞开放平台 (一)