从C/C++的内存分配(与操作系统相关)上来说,堆(heap),栈(stack)属于内存空间的一段区域。

效率:

栈是机器系统提供的数据结构,计算机会在底层对栈提供支持(有专门的寄存器存放栈的地址,压栈出栈都有专门的机器指令执行),这就决定了栈的效率比较高。

堆则是C/C++函数库提供的,它的机制是很复杂的。例如分配一块内存,堆会按照一定的算法,在堆内存中搜索可用的足够大小的空间,如果没有(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。总之,堆的效率比栈要低得多。

管理方式:

栈由编译器自动管理,无需人为控制,存放函数的参数值,局部变量的值等。当这个局部变量离开其作用域之后,所占用的内存则会被自动释放,因此在 C 中局部变量也叫自动变量。

堆一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 ,容易产生内存泄漏(memory leak)。、

空间大小:

栈一般有一定的空间大小(在VC6默认的栈空间大小是1M,也有默认2M的)。操作系统的栈在内存中高地址向低地址增长,也即低地址为栈顶,高地址为栈底。这就导致了栈的空间有限制,如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。

堆在32位系统下,内存可以达到4G的空间(虚拟内存的大小,有面试官问过),由此可见,堆获得的空间比较灵活,也比较大。

碎片问题:

栈不存在这个问题,因为栈是先进后出,不可能有一个内存块从栈中间弹出。在该块弹出之前,在它上面的(后进的栈内容)已经被弹出。

堆频繁的 new/delete 会造成内存空间的不连续,造成大量的碎片,使程序效率降低(重点是如何解决?如内存池、伙伴系统等)。

生长方向:

栈是向低地址扩展的数据结构(先进后出),是连续的内存的区域。

堆是向高地址扩展的数据结构,是不连续的内存区域。

猜你喜欢:

【编程】堆(heap)和栈(stack)的区别相关推荐

  1. bss段,data段、text段、堆heap和栈stack

    bss段,data段.text段.堆heap和栈stack bss段 data段 text段 堆(heap) 栈(stack) 例子 在C的学习中,你总避免不了对各类数据的存储区域学习归纳总结,简单的 ...

  2. JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )(转发)

    这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有 比较大的帮助. 废话不想讲了.入主题: 先了解具体的概念: JAVA的JVM的内存可分为3个区: ...

  3. (深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)(C/C++存储类型总结)(内存管理)

    文章目录 bss段 data段 text段 堆(heap) 栈(stack) 一个程序本质上都是由 bss段.data段.text段三个组成的. 存储类型总结 bss段 bss段(bss segmen ...

  4. JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

    JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指 ...

  5. JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )(转载)

    想想面试的时候很多会问jvm这方面的问题虽然还是菜鸟不太能用到现在但是还是了解一下, 找资料的时候看见个大佬写的很好转载到这方便以后自己复习和给大佬做宣传 以下为大佬的博客原文: 这两天看了一下深入浅 ...

  6. Java堆(heap)、栈(stack)和队列的区别

    Java里面Stack有两种含义: 一:数据结构 Stack,即java.util.Stack import java.util.Stack; import java.util.Iterator; i ...

  7. BSS段 data段 text段 堆heap 和 栈stack

    BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配.     ...

  8. 堆(heap)和栈(stack)有什么区别??

    简单的可以理解为: heap:是由malloc之类函数分配的空间所在地.地址是由低向高增长的. stack:是自动分配变量,以及函数调用的时候所使用的一些空间.地址是由高向低减少的. 预备知识-程序的 ...

  9. 堆(heap)和栈(stack)有什么区别

    简单的可以理解为: heap:是由malloc之类函数分配的空间所在地.地址是由低向高增长的. stack:是自动分配变量,以及函数调用的时候所使用的一些空间.地址是由高向低减少的. 程序的内存分配 ...

  10. 什么是堆什么是栈以及两者区别特点

    什么是堆什么是栈以及两者区别特点 一 英文名称 堆和栈是C/C++编程中经常遇到的两个基本概念.先看一下它们的英文表示: 堆――heap 栈――stack 二 从数据结构和系统两个层次理解 在具体的C ...

最新文章

  1. python列出文件夹最新的几个文件_Python列出一个文件夹及其子目录的所有文件
  2. Python 读取 csv 文件忽略引号中字段的逗号
  3. 安装你自己的perl modules
  4. linux C 获取日期时间
  5. 我对STL的一些看法(四)认识deque容器
  6. 图书管理系统 ——mysql数据库
  7. 2个鸡蛋,100层楼问题
  8. BIOS和UEFI的区别
  9. 第八章JRT/0197-2020金融数据安全数据安全分级指南解读
  10. 9.查找算法--二叉排序树
  11. Robcup2D足球学习记录【2020.01.14】
  12. Windows API一日一练(20)LoadIcon和LoadCursor函数-程序图标设置和鼠标的样式
  13. RateLimiter高并发访问限流
  14. 分布式认知工业互联网赋能工业企业数字化转型
  15. 计算机操作典型工作任务,典型工作任务描述表.doc
  16. libzip解压缩方法分析
  17. mysql的mgr是什么意思_MySQL之MGR简介
  18. macbook 备份系统
  19. Android环境配置时遇到问题及解决方案
  20. Halcon感兴趣区域填充特定颜色

热门文章

  1. 有关UNICODE、ANSI字符集和相关字符串操作的总结[转]
  2. Golang与C#之switch区别
  3. SQL SERVER数据导入到EXCEL
  4. nyoj 287(区间覆盖)
  5. hdu-2209 翻纸牌游戏
  6. k8s之informer简单理解
  7. MySQL STR_TO_DATE函数
  8. mysql主从复制--转载
  9. css 用direction来改变元素水平方向,价值研究。
  10. JqueryMobile- 搭建主模板